0

假设以下表格:

CREATE TABLE X (x_name VARCHAR(100));
CREATE TABLE Y (y_name VARCHAR(100));
INSERT INTO X VALUES ('blue');
INSERT INTO X VALUES ('red');
INSERT INTO Y VALUES ('blue');

导致:

+---------+        +---------+
| Table X |        | Table Y |
+---------+        +---------+
|  x_name |        |  y_name |
+---------+        +---------+
|  'blue' |        |  'blue' |
|   'red' |        +---------+
+---------+

以下查询的结果符合预期:

  • SELECT * FROM X WHERE x_name IN (SELECT y_name FROM Y);将返回一行| 'blue' |

  • SELECT * FROM X WHERE x_name NOT IN (SELECT y_name FROM Y);将返回一行| 'red' |

让我们插入NULL表 Y:

INSERT INTO Y VALUES (NULL);

第一个查询将返回相同的结果 ( blue)。但是,上面的第二个查询将不返回任何行。为什么是这样?

4

1 回答 1

1

不要not in与子查询一起使用。时期。使用not exists;它做你想做的事:

select x.*
from x
where not exists (select 1 from y where y.y_name = x.x_name);

问题是这样的。当你有:

x_name in ('a', 'b', null)

SQL 实际上返回NULL,而不是false。但是,NULL被视为与falseinwhere子句(和when子句但不用于check约束)相同。因此,该行被过滤掉了。

当您否定这一点时,可以是:

not x_name in ('a', 'b', null)
x_name not in ('a', 'b', null)

结果not NULL也是NULL,一切都被过滤掉了。

唉。我认为最简单的解决方案是养成使用not exists.

于 2020-06-10T14:30:18.123 回答