Om det finns "ingen rad alls för uid" och du JOIN
som du gör får du ingen rad som resultat. Använd LEFT [OUTER] JOIN
istället:
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;
Du behöver också parentesen jag lade till på grund av operatörsföreträde
. (AND
binder före OR
).
Jag använder IS DISTINCT FROM
istället för !=
i det sista WHERE-tillståndet eftersom återigen login.access
kan vara NULL
, som inte skulle kvalificera sig.
Men eftersom du bara verkar vara intresserad av kolumner från tabell u
Till att börja med skulle denna alternativa fråga vara mer elegant:
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
);
Detta alternativ har den ytterligare fördelen att du alltid får en rad från u
, även om det finns flera rader i u_org
eller login
.