当前位置: 首页 > 面试题库 >

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

梁研
2023-03-14
问题内容

我希望下面第三个查询的结果包含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


问题答案:

文档

为了符合该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
        )


 类似资料:
  • 在我看来,我的缓冲区包含关于最后一个数据包步骤(路由器->my home)的信息,这些信息解释了为什么TTL值是254以及为什么我用Traceroute找到了相同的两个IP: $>traceroute qwant.com traceroute to qwant.com(194.187.168.99),30跳最大,60字节数据包 172.17.0.1(172.17.0.1)0.026 ms 0.01

  • 问题内容: 给定一个变量,该变量包含巴黎时区的日期时间2000-01-01 00:01(冬季afaik中为UTC + 2): 我希望转换为UTC会导致日期时间为1999-12-31 22:01,但是却得到了: 我想念什么? 谢谢 问题答案: 不幸的是 ,在许多时区使用标准构造函数的参数“不起作用” 。 但是对于没有夏令时转换的时区来说是安全的,例如UTC: 您会注意到: “ LMT + 0:09:

  • 我有以下代码: 为什么它会打印Java流?

  • 我有以下代码,它将标记字符串以创建对象列表: 我预期的输出是 1#、#Jon#、#176 2#、#Jack#、#200 3#、#Jimmy#、#160 如果我把内部分界线更改为类似的东西,它会正常工作为什么会发生这种行为?

  • 我使用了以下映射:我修改了英语分析器来使用ngram分析器,如下所示,这样我应该能够在以下情况下进行搜索:1]部分搜索和特殊字符搜索2]以获得语言分析器的优势 将我的数据索引如下:

  • 问题内容: 我正在使用arange函数来定义for循环迭代并获得意外结果。 满足以下条件: 仍使用8.35的停止值,如下所示 产生以下 但是我希望我的射程结束于8.35!我知道我可以使用> 8.35和<8.4的止损值来获得我的结果,但是为什么它与众不同并且在我看来不一致? 编辑:我正在使用2.7版 问题答案: 也许这与浮点数的限制有关。由于机器的精度,不可能将所有可能的值完美地存储为浮点数。例如:

  • 问题内容: 我的XML看起来像这样- 我正在使用以下代码进行处理- 它输出为- 我的问题是为什么“孩子数量是”分别为5和3?我不应该分别期望2和1吗?因为第一个对象具有“ 和”,第二个对象仅具有“ ” 本质上,我的意图是处理“对象”的子级。 问题答案: 那是因为每个子节点之间有2 ()。 以下内容包括文本节点及其相应的值。 可以通过修改代码来验证: 输出: 其中,3 = 和1 = 。

  • 这是一个简单的程序,但我无法理解while loop在幕后所做的逻辑/工作。 问题:编写一个程序,打印从0到1的每个数字,小数点后有一个位数(即0.1、0.2等)。 这是我的代码: 如果我这样写它,它就会打印出来 输出: 理想地说,1和1.1不应该分别打印在两个代码示例中。打印0.9后,当0.1添加到它时,它变成1.0,即