Ако има „изобщо няма ред за uid“, и вие JOIN
като вас, вие няма ред като резултат. Използвайте LEFT [OUTER] JOIN
вместо това:
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;
Освен това имате нужда от скобите, които добавих, поради предимство на оператор
. (AND
се свързва преди OR
).
Използвам IS DISTINCT FROM
вместо !=
в последното условие WHERE, защото отново login.access
може да е NULL
, което не отговаря на изискванията.
Въпреки това, тъй като изглежда, че се интересувате само от колони от таблица u
като начало тази алтернативна заявка би била по-елегантна:
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
);
Тази алтернатива има допълнителното предимство, че винаги получавате един ред от u
, дори ако има няколко реда в u_org
или login
.