PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Left-Outer Join in Postgres gibt keine Werte für Null zurück

Ich gebe meine Antwort, weil ich erhebliche Zweifel an den anderen Antworten habe. Sie müssen auf die Filteranforderungen achten. Denken Sie daran, dass die where-Klausel nach Ihren Joins ausgeführt wird . Wenn es also irgendwelche Filteranforderungen in der where-Klausel gibt die auf die nicht-outer-joined-Tabelle verweisen, haben Sie (in vielen Fällen) Ihren Outer-Join annulliert. Wenn Sie also Ihr SQL nehmen, scheint es die einfachste Lösung zu sein, entweder den richtigen Join zu verwenden oder die Tabellennamen entsprechend zu verschieben und dann die Filterbedingungen aus der Where-Klausel in die Join-Klausel zu verschieben.

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

Ein anderer Weg, von dem ich glaube, dass er gleichwertig sein sollte, ist

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

Da es nicht unbedingt wichtig ist, wo die Filteranforderungen für fs_fault sind. (und Ihre SQL-Engine wird das sowieso ändern).

Bearbeiten:Hier ist ein SQLFiddle Demonstrieren der Filterung anhand der Join-Klausel im Vergleich zur Where-Klausel.