Si no hay "ninguna fila para el uid", y usted JOIN
como tú, obtienes ninguna fila como resultado. Use LEFT [OUTER] JOIN
en cambio:
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;
Además, necesita el paréntesis que agregué debido a precedencia de operadores
. (AND
se une antes de OR
).
Uso IS DISTINCT FROM
en lugar de !=
en la última condición WHERE porque, de nuevo, login.access
podría ser NULL
, que no calificaría.
Sin embargo, dado que solo parece estar interesado en las columnas de la tabla u
para empezar, esta consulta alternativa sería más 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 tiene la ventaja adicional de que siempre obtienes uno fila desde u
, incluso si hay varias filas en u_org
o login
.