PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Abfrage, bei der die Fremdschlüsselspalte NULL sein kann

Wenn es "überhaupt keine Zeile für die uid" gibt, und Sie JOIN wie Sie es tun, erhalten Sie keine Reihe als Ergebnis. Verwenden Sie LEFT [OUTER] JOIN stattdessen:

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;

Außerdem benötigen Sie die Klammer, die ich wegen Operatorvorrang . (AND bindet vor OR ).

Ich verwende IS DISTINCT FROM statt != in der letzten WHERE-Bedingung, weil wieder login.access könnte NULL sein , was sich nicht qualifizieren würde.

Da Sie jedoch anscheinend nur an Spalten aus der Tabelle u interessiert sind Eleganter wäre zunächst diese alternative Abfrage:

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
   );

Diese Alternative hat den zusätzlichen Vorteil, dass Sie immer eine erhalten Zeile von u , auch wenn es mehrere Zeilen in u_org gibt oder login .