sql >> Database >  >> RDS >> PostgreSQL

Left-Outer Join in Postgres Geeft geen waarden terug voor Null

Ik geef mijn antwoord omdat ik grote twijfels heb over de andere antwoorden. Je moet voorzichtig zijn met filtervereisten. Onthoud dat de where-clausule wordt uitgevoerd na uw joins . Dus als er filtervereisten zijn in de waar-clausule die verwijzen naar de niet-outer join-tabel, hebt u (in veel gevallen) uw outer join ongedaan gemaakt. Dus als je je sql neemt, lijkt de eenvoudigste oplossing om ofwel de juiste join te gebruiken of de tabelnamen op de juiste manier te verplaatsen, en vervolgens de filtervoorwaarden uit de where-clausule en naar de join-clausule te verplaatsen.

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

Een andere manier die volgens mij gelijkwaardig zou moeten zijn, is

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

Omdat het er niet echt toe doet waar de filtervereisten op fs_fault zijn. (en je SQL-engine gaat dat hoe dan ook veranderen).

Bewerken:hier is een SQLFiddle demonstreren van filtering op de join-clausule versus de where-clausule.



  1. Vreemde vergelijking met postgresql

  2. MySQL-prestaties:MySQL/MariaDB-indexen

  3. Converteer 'datetime' naar 'datetimeoffset' in SQL Server (T-SQL-voorbeelden)

  4. SQL UPDATE:leer hoe u waarden in een tabel kunt bijwerken