sql >> Databáze >  >> RDS >> PostgreSQL

Levé vnější připojení v Postgres nevrací hodnoty pro Null

Odpovídám, protože o ostatních odpovědích značně pochybuji. Musíte být opatrní ohledně požadavků na filtr. Pamatujte, že klauzule where běží po vašich spojeních . Pokud tedy existují nějaké požadavky na filtr v klauzuli where které odkazují na tabulku bez vnějšího spojení, jste (v mnoha případech) zrušili své vnější spojení. Takže když vezmete svůj SQL, zdá se, že nejjednodušším řešením je buď použít správné spojení, nebo vhodně přesunout názvy tabulek a poté přesunout podmínky filtru z klauzule where do klauzule spojení.

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

Dalším způsobem, který by podle mého názoru měl být ekvivalentní, je

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

Protože nezáleží na tom, kde jsou požadavky na filtr na fs_fault. (a váš SQL engine to stejně všechno změní).

Upravit:Zde je SQLFiddle demonstruje filtrování klauzule spojení vs. klauzule where.



  1. Nepodařilo se najít platný datový adresář. Obecná binární instalace MySQL

  2. Zcela odstraňte MariaDB nebo MySQL z CentOS 7 nebo RHEL 7

  3. Jak efektivně ukládat miliony statistických záznamů?

  4. Vkládání do Oracle Nested Table v Javě