如何显示与另一个表中的行不匹配的行?

时间:2012-08-09 11:33:51

标签: sql oracle

我想展示非区域经理的员工。

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

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

但是我无法弄清楚如何展示非区域经理的员工。我尝试过IS NOT,NOT LIKE,NOT IN等组合,但似乎都没有。

2 个答案:

答案 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 )

速度和效率再次取决于您的具体情况以及表格中的行数。