PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Jointure externe gauche dans Postgres ne renvoyant pas de valeurs pour Null

Je donne ma réponse car j'ai des doutes importants sur les autres réponses. Vous devez faire attention aux exigences de filtrage. N'oubliez pas que la clause where s'exécute après vos jointures . Donc, s'il y a des exigences de filtre dans la clause where qui font référence à la table jointe non externe, vous avez (dans de nombreuses circonstances) annulé votre jointure externe. Donc, en prenant votre sql, il semble que la solution la plus simple soit d'utiliser la bonne jointure ou de déplacer les noms de table de manière appropriée, puis de déplacer les conditions de filtre hors de la clause where et dans la clause de jointure.

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

Une autre façon qui, je pense, devrait être équivalente est

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

Comme peu importe où se trouvent les exigences de filtrage sur fs_fault. (et votre moteur SQL va tout changer de toute façon).

Modifier :Voici un SQLFiddle démonstration du filtrage sur la clause de jointure par rapport à la clause where.