Hvis der er "ingen række overhovedet for uid", og du JOIN
ligesom du gør, får du ingen række som resultat. Brug LEFT [OUTER] JOIN
i stedet:
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 har også brug for den parentes, jeg tilføjede på grund af operatørpræference
. (AND
binder før OR
).
Jeg bruger IS DISTINCT FROM
i stedet for !=
i den sidste WHERE-tilstand, fordi igen login.access
kan være NULL
, som ikke ville kvalificere sig.
Men da du kun ser ud til at være interesseret i kolonner fra tabel u
til at begynde med ville denne alternative forespørgsel være mere 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
);
Dette alternativ har den yderligere fordel, at du altid får en række fra u
, selvom der er flere rækker i u_org
eller login
.