我想显示不是病房管理员的员工。
我有这个显示病房经理的查询:
SELECT Name, Grade, WardManager, StaffNo
FROM STAFF, WARD
WHERE WARD.WardManager = STAFF.StaffNo;
但是我不知道如何显示不是病房经理的员工。我尝试了 IS NOT、NOT LIKE、NOT IN 等的组合,但它们似乎都不起作用。
不确定我是否正确理解了您的表结构,但是当有人抱怨不NOT IN
返回任何行时,几乎总是存在用于IN
运算符的列中的 NULL 值的问题。
试试这个:
select *
from staff
where staffno not in (select wardmanager
from ward
where wardmanager IS NOT NULL)
要替代 a_horse_with_no_name 的答案,也可以使用 a 来完成left outer join
:
select s.*
from staff s
left outer join ward w
on s.staffno = w.wardmanager
where w.wardmanager is null
这可以加入您想要的内容,然后要求不匹配的值。
至于哪个更快/更有效,这取决于您的具体情况,因此您必须同时测试并查看。
由于表中没有相关数据ward
(所有列都将为空),因此没有必要从该表中选择列。但是,a 的好处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 )
速度和效率再次取决于您的情况以及表中有多少行。