PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Join esterno sinistro in Postgres che non restituisce valori per Null

Sto dando la mia risposta perché ho dubbi significativi sulle altre risposte. Devi stare attento ai requisiti del filtro. Ricorda, la clausola where corre dopo i tuoi join . Quindi, se sono presenti requisiti di filtro nella clausola where che si riferiscono alla tabella non-outer join, hai (in molte circostanze) annullato il tuo outer join. Quindi, prendendo il tuo sql, sembra che la soluzione più semplice sia usare il join corretto o spostare i nomi delle tabelle in modo appropriato, quindi spostare le condizioni del filtro fuori dalla clausola where e nella clausola join.

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

Un altro modo che credo dovrebbe essere equivalente è

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

Poiché non è strettamente importante dove siano i requisiti del filtro su fs_fault. (e il tuo motore SQL cambierà comunque tutto).

Modifica:ecco un SQLFiddle dimostrando il filtraggio sulla clausola join rispetto alla clausola where.