sql >> Base de Datos >  >> RDS >> PostgreSQL

Unión exterior izquierda en Postgres que no devuelve valores para nulo

Estoy dando mi respuesta porque tengo dudas importantes sobre las otras respuestas. Tienes que tener cuidado con los requisitos de filtro. Recuerde, la cláusula where se ejecuta después de sus uniones . Entonces, si hay algún requisito de filtro en la cláusula where que se refieren a la tabla unida no externa, ha anulado (en muchas circunstancias) su unión externa. Entonces, tomando su sql, parece que la solución más simple es usar la unión adecuada o mover los nombres de las tablas de manera apropiada, y luego mover las condiciones de filtro fuera de la cláusula where y dentro de la cláusula de unión.

SELECT  f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount 
FROM    download_time d 
RIGHT OUTER JOIN fs_fault f ON 
    f.downloadtimeid = d.id
    AND f.faultcode IN (1000,1100)
    AND f.statusid IN(2, 4)
    AND d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012')
    AND d.bunoid = 166501
GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode

Otra forma que creo que debería ser equivalente es

SELECT  f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount 
FROM    download_time d 
RIGHT OUTER JOIN fs_fault f ON 
    f.downloadtimeid = d.id
    AND d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012')
    AND d.bunoid = 166501
WHERE
    f.faultcode IN (1000,1100)
    AND f.statusid IN(2, 4)
GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode

Como no importa estrictamente dónde están los requisitos de filtro en fs_fault. (y su motor SQL va a cambiar todo eso de todos modos).

Editar:aquí hay un SQLFiddle demostrando el filtrado en la cláusula join frente a la cláusula where.