sql >> Base de Datos >  >> RDS >> PostgreSQL

Consulta dónde la columna de clave externa puede ser NULL

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 .