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

Consulta onde a coluna de chave estrangeira pode ser NULL


Se não houver "nenhuma linha para o uid" e você JOIN como você faz, você não tem nenhuma linha como resultado. Use LEFT [OUTER] JOIN em vez de:
SELECT u.uid, u.fname, u.lname
FROM   u 
LEFT   JOIN u_org o ON u.uid = o.uid 
LEFT   JOIN login l ON u.uid = l.uid 
WHERE (o.orgid = 2 OR o.orgid IS NULL)
AND    l.access IS DISTINCT FROM 4;

Além disso, você precisa do parêntese que adicionei por causa de precedência do operador . (AND vincula antes de OR ).

Eu uso IS DISTINCT FROM em vez de != na última condição WHERE porque, novamente, login.access pode ser NULL , que não se qualificaria.

No entanto, como você parece estar interessado apenas nas colunas da tabela u para começar, essa consulta alternativa seria mais elegante:
SELECT u.uid, u.fname, u.lname
FROM   u
WHERE (u.uid IS NULL OR EXISTS (
   SELECT 1
   FROM   u_org o
   WHERE  o.uid = u.uid
   AND    o.orgid = 2
   ))
AND NOT EXISTS (
   SELECT 1
   FROM   login l
   WHERE  l.uid = u.uid
   AND    l.access = 4
   );

Esta alternativa tem a vantagem adicional de que você sempre ganha um linha de u , mesmo se houver várias linhas em u_org ou login .