我想展示非区域经理的员工。
我有这个显示病房经理的查询:
SELECT Name, Grade, WardManager, StaffNo
FROM STAFF, WARD
WHERE WARD.WardManager = STAFF.StaffNo;
但是我无法弄清楚如何展示非区域经理的员工。我尝试过IS NOT,NOT LIKE,NOT IN等组合,但似乎都没有。
答案 0 :(得分:1)
我不确定我是否正确理解了表结构,但是当有人抱怨NOT IN
没有返回任何行时,IN
运算符所使用的列中的NULL值几乎总是存在问题。
试试这个:
select *
from staff
where staffno not in (select wardmanager
from ward
where wardmanager IS NOT NULL)
答案 1 :(得分: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 )
速度和效率再次取决于您的具体情况以及表格中的行数。