7

orgid = 2の行がまったくない場合、またはない場合にデータを取得したいuidorgidですinteger。私が考えることができる最も近いことはすることですが、行がないIS NULLのデータを取得してuidいません。orgid何か案が?

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;

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

4

1 に答える 1

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;

また、演算子の優先順位のために追加した括弧が必要です。(AND前にバインドしORます)。

最後のWHERE条件のIS DISTINCT FROM代わりに使用します。これも、資格がない可能性があるためです。!=login.accessNULL

ただし、最初はテーブルの列にしか関心がないように思われるため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つの行を取得するという追加の利点があります。uu_orglogin

于 2012-11-29T03:22:56.233 に答える