Solved

Inner join NOT working - numeric fields

Posted on 2016-10-20
11
59 Views
Last Modified: 2016-11-07
I am trying to do an inner join in an open query (Oracle) where both join fields are numeric, but it returns zero results when I can see that there are matches between the two tables.


One table has almost 1 million records and the other has only 678. I'd hate to use a left outer join as it takes too long and gives me unwanted records/results.

"inner join on isnumeric(b.EMPL_NO) = isnumeric(a.emplid)"

How can I solve this?
Thanks
0
Comment
Question by:saved4use
  • 4
  • 2
  • 2
  • +3
11 Comments
 
LVL 40

Expert Comment

by:Sharath
ID: 41853190
Without looking into the data, it's hard to tell what's wrong. If they are numeric, why do you want to apply isnumeric again?
0
 

Author Comment

by:saved4use
ID: 41853218
Because the open query would not even run without isnumeric before the two fields.
0
 
LVL 22

Expert Comment

by:JesterToo
ID: 41853252
Are you certain that you are querying an Oracle database?  To the best of my knowledge, Oracle does not have an "isnumeric" function.  And if it did, this type of usage would be returning, and comparing, two boolean values.

I'm guessing that the actual datatypes of the two table fields is one of the various "char" types.  If so, you could use the "to_number" function to convert them from character to numeric.
0
U.S. Department of Agriculture and Acronis Access

With the new era of mobile computing, smartphones and tablets, wireless communications and cloud services, the USDA sought to take advantage of a mobilized workforce and the blurring lines between personal and corporate computing resources.

 
LVL 48

Expert Comment

by:Vitor Montalvão
ID: 41853635
It shouldn't be
"inner join on b.EMPL_NO = a.emplid" ?

What for do you need the isnumeric function?
0
 

Author Comment

by:saved4use
ID: 41854133
@JesterToo: I'm using an Oracle open query through SQL server.

@Vitor: I tried your suggestion above and it does not work/does not return results.

I even used this on the Oracle db and I get null in the results:

select

LENGTH(TRIM(TRANSLATE(EMPL_NO, ' +-.0123456789', '')))

from IBDD

where

LENGTH(TRIM(TRANSLATE(EMPL_NO, ' +-.0123456789', ''))) is null
0
 
LVL 32

Expert Comment

by:awking00
ID: 41854296
You cannot use an empty string for the to_string parameter of the translate function. You might try the following -
WHERE REPLACE(REGEXP_REPLACE(EMPL_NO,'[0-9\. +-]',''x'),'x','') IS NULL
Note - I used 'x' but it can be any character that will never show up in empl_no.
0
 
LVL 48

Expert Comment

by:PortletPaul
ID: 41856325
Could you provide a few values of each please? E.g.

Select top (10) b.EMPL_NO from b
Select top (10) a.emplid from a

Just a few of each should be enough
0
 

Accepted Solution

by:
saved4use earned 0 total points
ID: 41857762
I ended up dumping the query results into two tables, exporting the content to Excel and converting from text to number and working with them that way. It appears I was trying to join '00000518903' to '518903'
Nevertheless, thanks.
0
 
LVL 48

Expert Comment

by:PortletPaul
ID: 41857945
next time try something like these:

'00000518903' to 518903 (joining padded string to integer)

e.g.
inner join on b.EMPL_NO = RIGHT('00000000000' + cast(a.emplid as varchar(11)),11)

=====================
'00000518903' to '518903' (if joining padded string to string)

e.g.
inner join on b.EMPL_NO = RIGHT('00000000000' + a.emplid,11)

================

swap the columns names as needed (wasn't sure which one is zero padded)

=================
{+ edit}

it IS possible to work the other way (to convert the strings to numbers) BUT it might produce conversion error. However you could try these:


inner join on try_cast(b.EMPL_NO as integer) = a.emplid --<< try_cast() requires SQL Server 2012 or later

inner join on cast(b.EMPL_NO as integer) = a.emplid
0
 
LVL 48

Expert Comment

by:Vitor Montalvão
ID: 41858098
It appears I was trying to join '00000518903' to '518903'
Oh, now I think I understand the isnumeric(b.EMPL_NO) = isnumeric(a.emplid)

You should use CAST function to convert both fields to integer and to assure that those strings are valid number then use the ISNUMERIC function in the WHERE clause:
SELECT *
FROM Table1 a
    INNER JOIN Table2 b ON CAST(b.EMPL_NO AS INT) = CAST(a.emplid AS INT)
WHERE ISNUMERIC(b.EMPL_NO) = 1 AND ISNUMERIC(a.emplid) = 1

Open in new window

0
 

Author Closing Comment

by:saved4use
ID: 41876870
No other reasonable answer worked.
0

Featured Post

Resolve Critical IT Incidents Fast

If your data, services or processes become compromised, your organization can suffer damage in just minutes and how fast you communicate during a major IT incident is everything. Learn how to immediately identify incidents & best practices to resolve them quickly and effectively.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

JSON is being used more and more, besides XML, and you surely wanted to parse the data out into SQL instead of doing it in some Javascript. The below function in SQL Server can do the job for you, returning a quick table with the parsed data.
Load balancing is the method of dividing the total amount of work performed by one computer between two or more computers. Its aim is to get more work done in the same amount of time, ensuring that all the users get served faster.
Via a live example combined with referencing Books Online, show some of the information that can be extracted from the Catalog Views in SQL Server.
Viewers will learn how to use the UPDATE and DELETE statements to change or remove existing data from their tables. Make a table: Update a specific column given a specific row using the UPDATE statement: Remove a set of values using the DELETE s…

828 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question