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
.