PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Requête où la colonne de clé étrangère peut être NULL

S'il n'y a "pas de ligne du tout pour l'uid", et que vous JOIN comme vous le faites, vous n'obtenez aucune rangée à la suite. Utilisez LEFT [OUTER] JOIN à la place :

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;

De plus, vous avez besoin de la parenthèse que j'ai ajoutée à cause de priorité des opérateurs . (AND se lie avant OR ).

J'utilise IS DISTINCT FROM au lieu de != dans la dernière condition WHERE car, encore une fois, login.access peut être NULL , qui ne serait pas admissible.

Cependant, comme vous ne semblez vous intéresser qu'aux colonnes de la table u pour commencer, cette requête alternative serait plus élégante :

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
   );

Cette alternative a l'avantage supplémentaire que vous en obtenez toujours un ligne de u , même s'il y a plusieurs lignes dans u_org ou login .