PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Query in cui la colonna della chiave esterna può essere NULL

Se non c'è "nessuna riga per l'uid", e tu JOIN come te, non ottieni nessuna riga come risultato. Usa LEFT [OUTER] JOIN invece:

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;

Inoltre, è necessaria la parentesi che ho aggiunto a causa di precedenza dell'operatore . (AND si lega prima di OR ).

Uso IS DISTINCT FROM invece di != nell'ultima condizione WHERE perché, ancora, login.access potrebbe essere NULL , che non si qualificherebbe.

Tuttavia, poiché sembri essere interessato solo alle colonne della tabella u per cominciare, questa query alternativa sarebbe più 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
   );

Questa alternativa ha l'ulteriore vantaggio di ottenerne sempre uno riga da u , anche se ci sono più righe in u_org o login .