PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Junção externa esquerda no Postgres não retornando valores para nulo


Estou dando minha resposta porque tenho dúvidas significativas sobre as outras respostas. Você precisa ter cuidado com os requisitos de filtro. Lembre-se, a cláusula where executa após suas junções . Portanto, se houver algum requisito de filtro na cláusula where que se referem à tabela não externa unida, você anulou (em muitas circunstâncias) sua junção externa. Então, pegando seu sql, parece que a solução mais simples é usar a junção adequada ou mover os nomes das tabelas adequadamente e, em seguida, mover as condições do filtro da cláusula where para a cláusula 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

Outra maneira que eu acredito que deveria ser equivalente é
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

Como não importa estritamente onde estão os requisitos de filtro em fs_fault. (e seu mecanismo SQL vai mudar tudo de qualquer maneira).

Editar:Aqui está um SQLFiddle demonstrando a filtragem na cláusula join versus a cláusula where.