PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Połączenie lewostronne w Postgresie nie zwraca wartości dla wartości Null

Udzielam odpowiedzi, ponieważ mam poważne wątpliwości co do pozostałych odpowiedzi. Musisz uważać na wymagania dotyczące filtrów. Pamiętaj, że klauzula gdzie uruchamia się po Twoich przyłączeniach . Więc jeśli są jakieś wymagania dotyczące filtrów w klauzuli where które odnoszą się do tabeli sprzężonej poza zewnętrznymi, to (w wielu przypadkach) anulowałeś sprzężenie zewnętrzne. Biorąc więc pod uwagę swój sql, wydaje się, że najprostszym rozwiązaniem jest albo użycie odpowiedniego sprzężenia, albo odpowiednie przeniesienie nazw tabel, a następnie przeniesienie warunków filtrowania z klauzuli where do klauzuli 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

Innym sposobem, który moim zdaniem powinien być równoważny, jest

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

Ponieważ nie ma ściśle znaczenia, gdzie są wymagania dotyczące filtrów na fs_fault. (a twój silnik SQL i tak to wszystko zmieni).

Edycja:oto SQLFiddle demonstrowanie filtrowania na podstawie klauzuli join kontra klauzuli 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. Jak automatycznie zwiększyć wartość alfanumeryczną w postgresql?

  2. Odpowiednik DATEADD w PostgreSQL

  3. Postgresql:format daty i wyjście w lokalnym języku

  4. Postgresql usuwa wiele wierszy z wielu tabel

  5. postgres nie wie, gdzie znaleźć plik konfiguracyjny serwera