Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to have SQL INNER JOIN accept null results

I have the following query:

SELECT TOP 25 CLIENT_ID_MD5, COUNT(CLIENT_ID_MD5) TOTAL  FROM dbo.amazonlogs  GROUP BY CLIENT_ID_MD5  ORDER BY COUNT(*) DESC; 

Which returns:

283fe255cbc25c804eb0c05f84ee5d52    864458 879100cf8aa8b993a8c53f0137a3a176    126122 06c181de7f35ee039fec84579e82883d    88719 69ffb6c6fd5f52de0d5535ce56286671    68863 703441aa63c0ac1f39fe9e4a4cc8239a    47434 3fd023e7b2047e78c6742e2fc5b66fce    45350 a8b72ca65ba2440e8e4028a832ec2160    39524 ... 

I want to retrieve the corresponding client name (FIRM) using the returned MD5 from this query, so a row might look like:

879100cf8aa8b993a8c53f0137a3a176    126122    Burger King 

So I made this query:

SELECT a.CLIENT_ID_MD5, COUNT(a.CLIENT_ID_MD5) TOTAL, c.FIRM  FROM dbo.amazonlogs a    INNER JOIN dbo.customers c      ON c.CLIENT_ID_MD5 = a.CLIENT_ID_MD5 GROUP BY a.CLIENT_ID_MD5, c.FIRM  ORDER BY COUNT(*) DESC; 

This returns something like:

879100cf8aa8b993a8c53f0137a3a176    126122    Burger King 06c181de7f35ee039fec84579e82883d    88719     McDonalds 703441aa63c0ac1f39fe9e4a4cc8239a    47434     Wendy's 3fd023e7b2047e78c6742e2fc5b66fce    45350     Tim Horton's 

Which works, except I need to return an empty value for c.FIRM if there is no corresponding FIRM for a given MD5. For example:

879100cf8aa8b993a8c53f0137a3a176    126122    Burger King 06c181de7f35ee039fec84579e82883d    88719     McDonalds 69ffb6c6fd5f52de0d5535ce56286671    68863 703441aa63c0ac1f39fe9e4a4cc8239a    47434     Wendy's 3fd023e7b2047e78c6742e2fc5b66fce    45350     Tim Horton's 

How should I modify the query to still return a row even if there is no corresponding c.FIRM?

like image 210
Tom Redman Avatar asked Sep 28 '11 19:09

Tom Redman


People also ask

How do you inner join with NULL values?

A join that displays only the rows that have a match in both joined tables. Columns containing NULL do not match any values when you are creating an inner join and are therefore excluded from the result set. Null values do not match other null values.

How do you handle NULL values in SQL joins?

Because null values represent unknown or inapplicable values, Transact-SQL has no basis to match one unknown value to another. You can detect the presence of null values in a column from one of the tables being joined only by using an outer join.

Why NULL is not considered in inner join?

This is because NULL signifies the absence of any value, and cannot be compared as they will never equal anything. Doing say NULL = NULL results in False. If we inner joined these tables the same way, we would end up with the same result, because NULL values are not matched.

Can join happen on NULL values?

Since it's not possible to join on NULL values in SQL Server like you might expect, we need to be creative to achieve the results we want. One option is to make our AccountType column NOT NULL and set some other default value. Another option is to create a new column that will act as a surrogate key to join on instead.


2 Answers

Replace INNER JOIN with LEFT JOIN

like image 97
evilone Avatar answered Oct 24 '22 20:10

evilone


use LEFT JOIN instead of INNER JOIN

like image 45
Punit Avatar answered Oct 24 '22 20:10

Punit