PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Ляво-външно съединение в Postgres не връща стойности за Null

Давам своя отговор, защото имам сериозни съмнения относно другите отговори. Трябва да внимавате относно изискванията за филтъра. Не забравяйте, че клаузата where се изпълнява след вашите присъединявания . Така че, ако има някакви изисквания за филтър в клаузата where които се отнасят до не-външната съединена таблица, вие (при много обстоятелства) сте анулирали вашето външно съединяване. Така че, като вземем вашия sql, изглежда най-простото решение е или да използвате правилното съединение, или да преместите имената на таблиците по подходящ начин и след това да преместите условията на филтъра от клаузата where в клаузата за присъединяване.

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

Друг начин, който според мен трябва да е еквивалентен е

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

Тъй като няма строго значение къде са изискванията за филтъра на fs_fault. (и вашата SQL машина така или иначе ще промени всичко това).

Редактиране:Ето SQLFiddle демонстриране на филтриране на клаузата за присъединяване спрямо клаузата where.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql | Няма повече свободно място на устройството

  2. Подпълнете масиви с NULL до максимална дължина за персонализирана агрегатна функция

  3. hibernate 5 + ZonedDateTime + postgresql включват часова зона и отместване

  4. Неуспешна връзка с AWS RDS Postgres

  5. Как да вмъкнете външен ключ в модел на секвелизиране