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
.