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
.