2012-11-29 30 views
6

如果orgid = 2uid根本沒有行,我想獲取數據。 orgidinteger。我能想到的最接近的是做IS NULL,但我不是爲uid不具有orgid行中獲取數據。任何想法?查詢外鍵列的位置可以爲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; 

基本上OR是,如果u_org.orgid行不存在。

+1

我的猜測......你錯過了括號?試試這個:'(u_org.orgid = 2或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之前結合)。

我用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 
    ); 

這種替代具有額外的優勢,你總能得到一個從u行,即使有在u_orglogin多行。

+0

@Erwin_Brandstetter - 謝謝。 – user983223