"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;
はまた、あなたは私が原因operator precedenceの追加括弧を必要としています。 (AND
はOR
の前に結合する)。ので
私は最後のWHERE条件にIS DISTINCT FROM
代わりの!=
を使用し、再び、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_org
またはlogin
にあっても、の行はu
です。
私の推測...カッコがありませんか? '(u_org.orgid = 2 OR u_org.orgid IS NULL)AND login.access!= 4' – Wolph
また、次のようにして解決することもできます:' COALESCE(u_org.orgid、2)= 2' – Wolph
@WoLpH - どちらもそれを解決しなかった。たぶん 'IS NULL'は間違っているのでしょうか?行がデータベースに存在しない場合はNULLですか? – user983223