2011-09-28 15 views
25

tengo la siguiente consulta:Cómo tener SQL INNER JOIN aceptar resultados nulos

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

que devuelve:

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

Quiero recuperar el nombre de cliente correspondiente (FIRM) mediante el MD5 devuelto a partir de esta consulta, por lo que una fila podría ser:

879100cf8aa8b993a8c53f0137a3a176 126122 Burger King 

hice, pues, esta consulta:

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; 

Esto devuelve algo como:

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

que funciona, excepto necesito devolver un valor vacío para c.FIRM si hay ninguna firma correspondiente para un determinado MD5. Por ejemplo:

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

¿Cómo debería modificar la consulta para después volver una fila, incluso si no hay c.FIRM correspondiente?

+10

Es tono negro. Es probable que te coma una grue. – SQLMason

Respuesta

81

Reemplazar INNER JOIN con LEFT JOIN

+6

LEFT JOIN devuelve filas incluso cuando no hay coincidencia en la otra tabla a la que se está uniendo. INNER JOIN no, solo devuelve filas si hay una coincidencia en otra tabla – evilone

+0

Entonces * esa es * la diferencia ... – Jackson

2

una combinación interna excluye valores NULL; quieres unirte a IZQUIERDA EXTERIOR.

1
SELECT a.CLIENT_ID_MD5, COUNT(a.CLIENT_ID_MD5) TOTAL, IsNull(c.FIRM, 'Unknown') as Firm 
FROM dbo.amazonlogs a 
    LEFT 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; 

Esto le dará el valor "Desconocido" cuando los registros en la tabla de clientes no existan. Obviamente, puede soltar esa parte y simplemente devolver c.FIRM si desea tener nulos reales en su lugar.

2

En vez de hacer Una unión interior, usted debe hacer una combinación externa izquierda:

SELECT 
    a.CLIENT_ID_MD5, 
    COUNT(a.CLIENT_ID_MD5) TOTAL, 
    ISNULL(c.FIRM,'') 
FROM 
    dbo.amazonlogs a LEFT OUTER JOIN 
    dbo.customers c ON c.CLIENT_ID_MD5 = a.CLIENT_ID_MD5 
GROUP BY 
    a.CLIENT_ID_MD5, 
    c.FIRM 
ORDER BY COUNT(0) DESC 

http://www.w3schools.com/sql/sql_join.asp

+0

Tiene un error en la consulta - IZQUIERDA UNIRSE A – evilone

+0

Cheers evilone .. –

9

uso LEFT JOIN en lugar de INNER JOIN

1

Cambiar el INNER JOIN a una combinación externa ..

SELECT a.CLIENT_ID_MD5, COUNT(a.CLIENT_ID_MD5) TOTAL, c.FIRM 
FROM dbo.amazonlogs a 
LEFT OUTER 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; 
1
WITH amazonlogs_Tallies 
    AS 
    (
     SELECT a.CLIENT_ID_MD5, COUNT(a.CLIENT_ID_MD5) TOTAL 
     FROM dbo.amazonlogs a 
     GROUP 
      BY a.CLIENT_ID_MD5 
    ), 
    amazonlogs_Tallies_Firms 
    AS 
    (
     SELECT a.CLIENT_ID_MD5, a.TOTAL, c.FIRM 
     FROM amazonlogs_Tallies a 
      INNER JOIN dbo.customers c 
       ON c.CLIENT_ID_MD5 = a.CLIENT_ID_MD5 
    ) 
SELECT CLIENT_ID_MD5, TOTAL, FIRM 
    FROM amazonlogs_Tallies_Firms 
UNION 
SELECT CLIENT_ID_MD5, TOTAL, '{{NOT_KNOWN}}' 
    FROM amazonlogs_Tallies 
EXCEPT 
SELECT CLIENT_ID_MD5, TOTAL, '{{NOT_KNOWN}}' 
    FROM amazonlogs_Tallies_Firms;