Jeśli nie ma żadnego wiersza dla identyfikatora UID, a ty JOIN
tak jak ty, brak wiersza w wyniku. Użyj LEFT [OUTER] JOIN
zamiast tego:
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;
Potrzebujesz również nawiasu, który dodałem, ponieważ pierwszeństwo operatora
. (AND
wiąże przed OR
).
Używam IS DISTINCT FROM
zamiast !=
w ostatnim warunku WHERE, ponieważ ponownie login.access
może być NULL
, co nie kwalifikuje się.
Jednakże, ponieważ wydaje Ci się, że interesują Cię tylko kolumny z tabeli u
na początek to alternatywne zapytanie byłoby bardziej eleganckie:
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
);
Ta alternatywa ma tę dodatkową zaletę, że zawsze otrzymujesz jeden wiersz z u
, nawet jeśli istnieje wiele wierszy w u_org
lub login
.