sql> SELECT * FROM runners;
+----+--------------+
| id | name |
+----+--------------+
| 1 | John Doe |
| 2 | Jane Doe |
| 3 | Alice Jones |
| 4 | Bobby Louis |
| 5 | Lisa Romero |
+----+--------------+
sql> SELECT * FROM races;
+----+----------------+-----------+
| id | event | winner_id |
+----+----------------+-----------+
| 1 | 100 meter dash | 2 |
| 2 | 500 meter dash | 3 |
| 3 | cross-country | 2 |
| 4 | triathalon | NULL |
+----+----------------+-----------+
下面查询的结果是什么?
SELECT * FROM runners WHERE id NOT IN (SELECT winner_id FROM races);
上面的查询不会返回任何内容,因为 races 表包含 null winner_id
。但这背后的原因是什么?
是这样的(实际值来自
races
):id <> null
根据定义unknown
,因此整个where
子句的计算结果为false
(for ids: 2, 3) 或unknown
(for ids: 1, 4, 5) 因为and
运算符,因此没有返回结果。如果要运行查询而不考虑 中的空值
races
,可以使用:我建议不要做巴拉兹正在做的事情。这就是
NOT EXISTS
目的,它处理空值。让我们来看看这个..创建示例数据
问题复习
现在,根据较早的答案和文档,
如果任何 bar.x 为 NULL,则整个条件为 NULL,因此返回 0 行。
解决方案
NOT IN
如果集合可以为空并使用NOT EXISTS
测试,最好的解决方案是完全跳过。这将返回 90 行。
或者,这可以写成 this..