Als er "helemaal geen rij is voor de uid", en je JOIN
zoals jij krijgt, krijg je geen rij als resultaat. Gebruik LEFT [OUTER] JOIN
in plaats daarvan:
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;
Je hebt ook de haakjes nodig die ik heb toegevoegd vanwege operatorvoorrang
. (AND
bindt vóór OR
).
Ik gebruik IS DISTINCT FROM
in plaats van !=
in de laatste WHERE-voorwaarde omdat, nogmaals, login.access
kan NULL
zijn , die niet in aanmerking zouden komen.
Aangezien u echter alleen geïnteresseerd lijkt te zijn in kolommen uit tabel u
om te beginnen zou deze alternatieve vraag eleganter zijn:
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
);
Dit alternatief heeft als bijkomend voordeel, dat je altijd één . krijgt rij van u
, zelfs als er meerdere rijen zijn in u_org
of login
.