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

Venstre-ydre Deltag i Postgres Returnerer ikke værdier for Null

Jeg giver mit svar, fordi jeg er meget i tvivl om de andre svar. Du skal være forsigtig med filterkravene. Husk, hvor-sætningen kører efter dine joins . Så hvis der er filterkrav i where-klausulen der refererer til den ikke-ydre sammenføjede tabel, har du (i mange tilfælde) annulleret din ydre joinforbindelse. Så tager du din sql, ser det ud til, at den enkleste løsning er enten at bruge den korrekte join eller at flytte tabelnavnene på passende vis, og derefter flytte filterbetingelserne ud af where-sætningen og ind i join-klausulen.

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

En anden måde, som jeg mener burde være ækvivalent, er

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 det ikke er helt ligegyldigt, hvor filterkravene på fs_fault er. (og din SQL-motor vil ændre det hele alligevel).

Rediger:Her er en SQLFiddle demonstrerer filtrering på join-klausulen vs. where-klausulen.



  1. Kan MySQL-systemdatabasetabellerne konverteres til InnoDB?

  2. Hvad er den sande værdi af at bringe Microsoft Access ind i din organisation?

  3. Sådan fungerer SQLite Min()

  4. Kun backup af SQL-skema?