小编典典

MySQL SELECT x FROM WHERE NOT IN(SELECT x FROM b)-意外的结果

mysql

我希望下面第三个查询的结果包含id = 732。没有。这是为什么?

mysql> SELECT id FROM match ORDER BY id DESC LIMIT 5;
+ ------------ +
| id |
+ ------------ +
| 732 |
| 730 |
| 655 |
| 458 |
| 456 |
+ ------------ +
设置5行(0.00秒)

mysql> SELECT id from email ORDER BY id DESC LIMIT 5;
+ ------------ +
| id |
+ ------------ +
| 731 |
| 727 |
| 725 |
| 724 |
| 723 |
+ ------------ +
设置5行(0.00秒)

mysql> SELECT * FROM匹配WHERE ID NOT IN(SELECT ID FROM email);
空置(0.00秒)

表email.id中有三个NULL条目,match.id中没有NULL条目。

完整的表格/查询可以在
http://pastebin.ca/1462094


阅读 633

收藏
2020-05-17

共1个答案

小编典典

文档

为了符合该SQL标准,不仅在左侧的表达式IN
为时返回,而且在列表中未找到匹配项并且列表中的表达式之一为时返回。NULL``NULL``NULL

这正是您的情况。

两者INNOT INreturn NULL都不是WHERE子句可接受的条件。

重写查询,如下所示:

SELECT  *
FROM    match m
WHERE   NOT EXISTS
        (
        SELECT  1
        FROM    email e
        WHERE   e.id = m.id
        )
2020-05-17