Sql 如何显示不带';不匹配另一个表中的行吗?

Sql 如何显示不带';不匹配另一个表中的行吗?,sql,oracle,Sql,Oracle,我想展示不是病房经理的员工 我有一个查询,显示病房经理: SELECT Name, Grade, WardManager, StaffNo FROM STAFF, WARD WHERE WARD.WardManager = STAFF.StaffNo; 然而,我不知道如何展示那些不是病房经理的员工。我尝试了IS NOT、NOT LIKE、NOT IN等组合,但它们似乎都不起作用。我不确定是否正确理解了表结构,但当有人抱怨NOT IN没有返回行时,用于IN运算符的列中的空值几乎总是

我想展示不是病房经理的员工

我有一个查询,显示病房经理:

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

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

我不确定是否正确理解了表结构,但当有人抱怨
NOT IN
没有返回行时,用于
IN
运算符的列中的空值几乎总是一个问题

试试这个:

select *
from staff
where staffno not in (select wardmanager 
                      from ward 
                      where wardmanager IS NOT NULL)

要提供带有“无”名称答案的“马”的替代方案,也可以通过
左外连接来完成:

select s.*
  from staff s
  left outer join ward w
    on s.staffno = w.wardmanager
 where w.wardmanager is null
这样做可以让你加入到你想要的东西中,但是要求的是不匹配的值

至于哪一个更快/更有效,因此您必须同时测试这两种方法并查看

由于
ward
表中没有相关数据(所有列都将为空),因此从该表中选择列没有意义。然而,
加入
的好处是,如果您愿意,您可以加入。例如,您删除了
where
子句,您可以返回病房经理的员工和非病房经理的员工。区别在于
ward
中的列在不是经理时总是空的

另一种方法是使用
where exists
,但与
not in
类似,这仅适用于不想从
ward返回任何列的情况

select s.*
  from staff s
 where not exists ( select 1
                      from ward w
                     where wardmanager = s.staffno )

同样,速度和效率取决于您的环境以及表中有多少行。

列的类型是什么?如果数据类型相同,我看不出有任何理由不可能做到这一点。您遇到了什么错误?@henry:请参阅此处以获得更详细的解释:(这是SQL Server语法,但基本逻辑相同)