sql >> Databasteknik >  >> RDS >> PostgreSQL

Vänster-yttre gå med i Postgres Returnerar inte värden för Null

Jag ger mitt svar eftersom jag har stora tvivel om de andra svaren. Du måste vara försiktig med filterkrav. Kom ihåg att where-satsen körs efter dina joins . Så om det finns några filterkrav i where-satsen som hänvisar till den icke-yttre sammanfogade tabellen, har du (i många fall) upphävt din yttre sammanfogning. Så med din sql, verkar det som att den enklaste lösningen är att antingen använda rätt join eller flytta tabellnamnen på lämpligt sätt, och sedan flytta filtervillkoren från where-satsen och in i join-satsen.

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

Ett annat sätt som jag anser borde vara likvärdigt är

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

Eftersom det inte spelar någon roll var filterkraven på fs_fault är. (och din SQL-motor kommer att ändra på det hela ändå).

Edit:Här är en SQLFiddle demonstrerar filtrering på join-satsen kontra where-satsen.



  1. Mysql Välj rader där två kolumner inte har samma värde

  2. Matrismultiplikation i python och mysql

  3. SQL:Få produkter från en kategori men måste också vara i en annan uppsättning kategorier

  4. Identifieraren 'APEX_JSON.PARSE' måste deklareras i Oracle 11.2.0