问题描述
对于 https://sqlbolt.com/lesson/select_queries_with_nulls
中第 8 课的第二个问题,我有另一个答案找出没有雇员的建筑物的名称
我的尝试是:
SELECT building_name FROM buildings WHERE building_name NOT IN(SELECT disTINCT(building) FROM employees);
它没有将我的答案返回为正确的,而是更喜欢答案 SELECT building_name FROM buildings LEFT JOIN employees ON building_name = building WHERE name IS NULL
如果我做错了,请告诉我。我不认为这里需要加入。谢谢
解决方法
您没有犯“错误”。但是你的查询还有两个问题。
首先,select distinct
完全没有必要。 IN
/NOT IN
负责处理这些问题——它们会忽略重复项。
更重要的是,对于 NOT IN
值,NULL
并不像大多数人所期望的那样工作——如果子查询中的任何值是 NULL
,则不会返回任何结果 /em>。如果 employees
表在 NULL
中没有 building
值,那么您的版本应该可以正常工作。
因此,我强烈建议您始终将 NOT EXISTS
与子查询一起使用:
SELECT b.building_name
FROM buildings b
WHERE NOT EXISTS (SELECT 1
FROM employees e
WHERE b.building_name = e.building
);
LEFT JOIN
版本在功能上与此版本相同。