我想顯示不是病房管理員的員工。如何顯示與其他表中的行不匹配的行?
我有這個疑問,顯示病房經理:
SELECT Name, Grade, WardManager, StaffNo
FROM STAFF, WARD
WHERE WARD.WardManager = STAFF.StaffNo;
但我無法弄清楚如何顯示誰是沒有招架的經理人員。我已經嘗試了不是,不喜歡,不在等等的組合,似乎都沒有工作。
我想顯示不是病房管理員的員工。如何顯示與其他表中的行不匹配的行?
我有這個疑問,顯示病房經理:
SELECT Name, Grade, WardManager, StaffNo
FROM STAFF, WARD
WHERE WARD.WardManager = STAFF.StaffNo;
但我無法弄清楚如何顯示誰是沒有招架的經理人員。我已經嘗試了不是,不喜歡,不在等等的組合,似乎都沒有工作。
不知道我是否正確理解了表結構,但是當有人抱怨說NOT IN
未返回任何行時,對於IN
運算符所使用的列中的NULL值幾乎總是存在問題。
試試這個:
select *
from staff
where staffno not in (select wardmanager
from ward
where wardmanager IS NOT NULL)
這很美。 – henry 2012-08-09 11:42:55
@henry:在這裏看到更詳細的解釋:http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx(這是SQL Server的語法,但基本邏輯是一樣的) – 2012-08-09 11:46:40
舉一個替代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)
速度和效率再一次取決於您的情況以及表格中的行數。
什麼是列的類型? – 2012-08-09 11:36:17
他們是號碼。 – henry 2012-08-09 11:39:36
如果數據類型相同,我認爲沒有任何理由不可能做到這一點。你遇到了什麼錯誤? – Kamal 2012-08-09 11:43:44