【问题标题】:Oracle Select LogicOracle 选择逻辑
【发布时间】: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,感谢您的澄清!我以为我检查了这两种情况,但显然你是对的!

标签: sql oracle select notin


【解决方案1】:

正如 dnoeth 指出的那样:

如果我的选择中有 NULL,则 IN 子句将不起作用。所以最后我会使用:

Select * From Table1 T1
Where T1.ID not in ( Select Id From Table2 T2 Where 1 = 1 and T2.Id is not null)

感谢 dnoeth。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 2023-03-30
    • 1970-01-01
    • 2015-01-08
    • 2011-01-24
    • 2023-03-16
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多