sql - 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
如果我犯了错误,请告诉我。我认为这里不需要加入。谢谢
解决方案
你没有犯“错误”。但是您查询仍然有两个问题。
首先,select distinct
完全没有必要。 IN
/NOT IN
照顾 - 他们忽略重复。
更重要的是,NOT IN
它不会像大多数人期望的那样使用NULL
值——如果子查询中的任何值是,则根本NULL
不会返回任何结果。如果表中没有值,那么您的版本应该按预期工作。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
版本在功能上与此版本相同。
推荐阅读
- php - PHP Curl 错误 2 从浏览器执行脚本时初始化失败
- javascript - 在数组上调用 Javascript 函数 .forEach,不会导致问题
- spring - 如何创建一个 JPARepository 方法,根据我给它的参数过滤我的搜索?
- r - 在 R 中绘制直方图和 UpSet 图
- javascript - 将数字更改为对象中的字符串 - javascript
- c++ - 使用 conan 和 cmake 编译会出现致命错误 LNK1104
- isabelle - 如何在 Isabelle 中引入 forall
- php - laravel typehint 集合
- html - 角度,侧边栏问题
- android - 为什么有时不会在 onResume() 中添加视图?