微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLBolt.com - 第 8 课第 2 季度的替代答案

如何解决SQLBolt.com - 第 8 课第 2 季度的替代答案

对于 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 版本在功能上与此版本相同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。