Pokud neexistuje "vůbec žádný řádek pro uid" a JOIN
stejně jako vy, nemáte žádný řádek jako výsledek. Použijte LEFT [OUTER] JOIN
místo toho:
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;
Také potřebujete závorku, kterou jsem přidal kvůli Priorita operátora
. (AND
se váže před OR
).
Používám IS DISTINCT FROM
místo !=
v poslední podmínce WHERE, protože opět login.access
může být NULL
, která by nesplňovala podmínky.
Protože se však zdá, že vás zajímají pouze sloupce z tabulky u
pro začátek by tento alternativní dotaz byl elegantnější:
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
);
Tato alternativa má navíc tu výhodu, že vždy dostanete jeden řádek od u
, i když je v u_org
více řádků nebo login
.