2017-01-25 77 views
0

我有兩個表。 最前一頁是 「tab_task」我想選擇不符合條件的行或「條件除外」

task_id| task_name | created_by | status 
    ------------------------------------------- 
    1 | task1  | aarav | 1 
    2 | task2  | rahul | 0 
    3 | task3  | aarav | 0 
    4 | task4  | jasmin | 0 
    5 | task5  | yamini | 1 
    6 | task6  | priyanka | 0 
    7 | task7  | manish | 1 
    8 | task8  | aarav | 1 

,第二個表是 「tab_user」

user_id| txt_full_name| 
    ------------------------- 
    1 | aarav  | 
    2 | rahul  | 
    3 | yamini  | 
    4 | jasmin  |  
    5 | manish  | 
    6 | priyanka | 

SELECT created_by from tab_task where status='1' 現在我們有4行 「aarav,雅米妮(Yamini),馬尼什和aarav」。

現在我想從「tab_user」中獲取「txt_full_name」,其中「txt_full_name」不等於「tab_task的created_by」。 我的意思是我想要從「tab_user」獲取:rahul,jasmin,priyanka。

+0

粗略地選擇x。* from x left join y on y.something = x.something and y.otherthing =? WHERE y.primary_key IS NULL – Strawberry

回答

2

一個直接的解決方案:

SELECT txt_full_name FROM tab_user 
    WHERE txt_full_name NOT IN (SELECT created_by from tab_task where status='1') 

(注意,以上假定created_by列是NOT NULL,否則查詢不會因爲與NULL收率UNKNOWN比較返回任何行 - fiddle - doesn't work with NULL data)。

+0

如果從子查詢返回一個爲NULL的created_by,會發生什麼情況? – jarlh

+0

@jarlh好趕 - http://sqlfiddle.com/#!9/09b01/1 –

+2

這就是爲什麼我通常做'不存在'而不是。如果NULL值突然顯示,那麼結果並不令人驚訝。 – jarlh

0

嘗試加入的表,然後選擇空行:

SELECT txt_full_name FROM tab_user 
LEFT OUTER JOIN 
(
    SELECT created_by from tab_task where status='1' 
)tbStat 
ON created_by = txt_full_name 
WHERE created_by IS NULL 
1

除了@Jiri Tousek的IN解決方案,也可以使用JOINEXISTS語法:

select u.txt_full_name 
from tab_user u 
left join tab_task t 
on u.txt_full_name = t.created_by 
and t.status = '1' 
where t.created_by is null; 

或者

select u.txt_full_name 
from tab_user u 
where not exists(
    select 1 from tab_task t where u.txt_full_name = t.created_by and t.status = '1' 
); 

並參見demo她即