【发布时间】:2019-07-17 15:50:39
【问题描述】:
我被一个查询卡住了,它没有返回任何值,尽管它应该返回。我有
Table1 有大约 50000 个不同的 ID,以及 Table2 有大约 1000 个不同的 ID。我运行这个查询:
Select * From Table1 T1
Where T1.ID not in ( Select Id From Table2 T2 Where 1 = 1 )
我确实希望这个查询至少给我 49000 行,但我没有得到一个。现在,当我运行时
Select * From Table1 T1
Where T1.ID not in ( Select Id From Table2 T2 Where T2.Id = T1.Id )
我确实得到了我的预期结果(即 49000 行)。但是,我觉得我不太合乎逻辑。从理论的角度来看,第二个 where 子句没有意义,第一个查询无论如何都应该工作......
【问题讨论】:
-
您的子查询可能返回 NULL(搜索三值逻辑),尝试添加
WHERE id IS NOT NULL(或切换到Where NOT EXISTS ( Select * From Table2 T2 Where T2.Id = T1.Id ) -
嗯,对 :-) 谢谢 - 我实际上在 T2 中得到了一个空值。
-
@dnoeth:PS:感谢“3VL”参考。阅读完这篇文章后,我觉得 SQL 无法应用“5 in (1,2,3,4,5,null) 为假”的结果,因为我将 IN 子句理解为迭代的 OR 子句。 True OR unknown 在 3VL 中为真。不过我可以忍受。 SQL 可以有自己的规则...
-
"5 in (1,2,3,4,5,null) is false" 是错误的,对于 ORed 条件,任何返回 TRUE 的比较都会导致 TRUE,因此 NULL 会被忽略。但是“5 NOT in (1,2,3,4,5,null)”是 AND 条件,任何 UNKNOWN 与 NULL 的比较都会导致 UNKNOWN,无法返回答案集。
-
您好 Dnoeth,感谢您的澄清!我以为我检查了这两种情况,但显然你是对的!