Se não houver "nenhuma linha para o uid" e você
JOIN
como você faz, você não tem nenhuma linha como resultado. Use LEFT [OUTER] JOIN
em vez de: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;
Além disso, você precisa do parêntese que adicionei por causa de precedência do operador . (
AND
vincula antes de OR
). Eu uso
IS DISTINCT FROM
em vez de !=
na última condição WHERE porque, novamente, login.access
pode ser NULL
, que não se qualificaria. No entanto, como você parece estar interessado apenas nas colunas da tabela
u
para começar, essa consulta alternativa seria mais elegante: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
);
Esta alternativa tem a vantagem adicional de que você sempre ganha um linha de
u
, mesmo se houver várias linhas em u_org
ou login
.