首页 > 解决方案 > SQLBolt.com - 第 8 课的替代答案,Q2

问题描述

我对来自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

如果我犯了错误,请告诉我。我认为这里不需要加入。谢谢

标签: sqlsql-null

解决方案


你没有犯“错误”。但是您查询仍然有两个问题。

首先,select distinct完全没有必要。 IN/NOT IN照顾 - 他们忽略重复。

更重要的是,NOT IN它不会像大多数人期望的那样使用NULL值——如果子查询中的任何值是,则根本NULL不会返回任何结果。如果表中没有值,那么您的版本应该按预期工作。employeesNULLbuilding

出于这个原因,我强烈建议您始终使用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版本在功能上与此版本相同。


推荐阅读