2012-08-09 108 views
0

我想顯示不是病房管理員的員工。如何顯示與其他表中的行不匹配的行?

我有這個疑問,顯示病房經理:

SELECT Name, Grade, WardManager, StaffNo 
FROM STAFF, WARD 
WHERE WARD.WardManager = STAFF.StaffNo; 

但我無法弄清楚如何顯示誰是沒有招架的經理人員。我已經嘗試了不是,不喜歡,不在等等的組合,似乎都沒有工作。

+1

什麼是列的類型? – 2012-08-09 11:36:17

+0

他們是號碼。 – henry 2012-08-09 11:39:36

+0

如果數據類型相同,我認爲沒有任何理由不可能做到這一點。你遇到了什麼錯誤? – Kamal 2012-08-09 11:43:44

回答

1

不知道我是否正確理解了表結構,但是當有人抱怨說NOT IN未返回任何行時,對於IN運算符所使用的列中的NULL值幾乎總是存在問題。

試試這個:

select * 
from staff 
where staffno not in (select wardmanager 
         from ward 
         where wardmanager IS NOT NULL) 
+0

這很美。 – henry 2012-08-09 11:42:55

+0

@henry:在這裏看到更詳細的解釋:http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx(這是SQL Server的語法,但基本邏輯是一樣的) – 2012-08-09 11:46:40

0

舉一個替代a_horse_with_no_name的回答這個問題,也可以用left outer join完成:

select s.* 
    from staff s 
    left outer join ward w 
    on s.staffno = w.wardmanager 
where w.wardmanager is null 

這個工程能夠加入你想要什麼,但隨後要求值爲不是匹配。

至於哪個更快/更高效it depends on your specific circumstances所以你不得不測試兩個,看看。

由於ward表中沒有相關數據(所有列都將爲空),因此沒有要從該表中選擇列的數據。然而,join的好處是,你可以,如果你想。比方說,例如,你刪除了where條款,你可以返回那些不是經理和員工的工作人員。差異在於ward的列在他們不是經理時總是爲空。

這樣做的另一種方法是使用where exists,但是像not in這隻適用於您不希望返回ward中的任何列。

select s.* 
    from staff s 
where not exists (select 1 
         from ward w 
        where wardmanager = s.staffno) 

速度和效率再一次取決於您的情況以及表格中的行數。

相關問題