请帮忙! 我有3张桌子:
employee,
assign,
vehicle.
只有2名员工可以占用1辆车。我需要选择所有不包含任何车辆的员工。
查询:
select EID,
Employee_name
from employee
where EID not in (
select user1
from assign
)
and EID not in (
select user2
from assign
)
如果“user1”或“user2”中的所有单元格都已填充,则此查询有效。 如果assign表的“user1”或“user2”为空值
分配表值
查询输出为空
查询结果
如果用值填入,它将返回所有EID和employee_name(s) 不在分配表中的User1和User2中。如果所有user1和user2都已填满,则AKA正常工作。如何以不显示assign.user1或assign.user2为空的方式显示所有可用员工的方式重新创建此查询。
答案 0 :(得分:1)
您可以使用not exists
:
select eid,
employee_name
from employee e
where not exists (
select 1
from assign a
where e.eid in (a.user1, a.user2)
);
答案 1 :(得分:0)
您也可以使用NOT NULL
SELECT eid, employee_name
FROM employee
WHERE eid not in (
SELECT user1
FROM assign
WHERE user1 IS NOT NULL
UNION
SELECT user2
FROM assign
WHERE user2 IS NOT NULL
)
答案 2 :(得分:0)
两个答案都很好。如果您想了解更多有关查询无效的原因,请参阅以下简短说明。
问题来自SQL如何处理NULL
值。 SQL不是基于二值逻辑,而是基于三值逻辑:即TRUE
,FALSE
和UNKNOWN
。
在您的查询中,只要EID
与NULL
或user1
列中的user2
值进行比较,结果就不会是TRUE
也不会FALSE
},但是UNKNOWN
。
另外一种方法是使用函数COALESCE()
或IFNULL()
:
w3schools on coalesce(), ifnull() and others
有关所有这些内容的更多信息,您可以查看oracle文档以及其他来源:
希望它有所帮助!