「uidの行がまったくない」場合、JOIN
あなたと同じように、行がない 結果として。 LEFT [OUTER] JOIN
代わりに:
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;
また、演算子の優先順位
。 (AND
OR
の前にバインドします 。
IS DISTINCT FROM
を使用しています !=
の代わりに 最後のWHERE条件では、ここでもlogin.access
NULL
の可能性があります 、これは対象外です。
ただし、テーブルu
の列にのみ関心があるようです。 まず、この代替クエリはより洗練されたものになります:
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
);
この代替手段には、常に1つを取得できるという追加の利点があります。 u
からの行 、u_org
に複数の行がある場合でも またはlogin
。