2012-11-29 8 views
6

orgid = 2の場合はデータを取得したい場合はuidの行がまったくない場合は、 orgidintegerです。私が考えることができる最も近いのはIS NULLですが、の行を持たないuidのデータは取得できません。何か案が?外部キー列がNULLの場合のクエリ

select u.uid,u.fname,u.lname from u 
inner join u_org on u.uid = u_org.uid 
inner join login on u.uid = login.uid 
where u_org.orgid=2 or u_org.orgid is NULL 
and login.access != 4; 

u_org.orgid行が存在しない場合は基本的にORです。

+1

私の推測...カッコがありませんか? '(u_org.orgid = 2 OR u_org.orgid IS NULL)AND login.access!= 4' – Wolph

+0

また、次のようにして解決することもできます:' COALESCE(u_org.orgid、2)= 2' – Wolph

+0

@WoLpH - どちらもそれを解決しなかった。たぶん 'IS NULL'は間違っているのでしょうか?行がデータベースに存在しない場合はNULLですか? – user983223

答えて

6

"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の追加括弧を必要としています。 (ANDORの前に結合する)。ので

私は最後の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です。

+0

@Erwin_Brandstetter - ありがとうございます。 – user983223

関連する問題