0

我想显示不是病房管理员的员工。

我有这个显示病房经理的查询:

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

但是我不知道如何显示不是病房经理的员工。我尝试了 IS NOT、NOT LIKE、NOT IN 等的组合,但它们似乎都不起作用。

4

2 回答 2

1

不确定我是否正确理解了您的表结构,但是当有人抱怨不NOT IN返回任何行时,几乎总是存在用于IN运算符的列中的 NULL 值的问题。

试试这个:

select *
from staff
where staffno not in (select wardmanager 
                      from ward 
                      where wardmanager IS NOT NULL)
于 2012-08-09T11:39:02.117 回答
0

要替代 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 )

速度和效率再次取决于您的情况以及表中有多少行。

于 2012-08-09T12:32:49.180 回答