NOT IN 运算符问题 Oracle

Posted

技术标签:

【中文标题】NOT IN 运算符问题 Oracle【英文标题】:NOT IN operator issue Oracle 【发布时间】:2012-07-18 18:46:40 【问题描述】:

这是我的查询:

Select a.* from Table1 a, Table2 b
Where 
a.tid=b.tid and 
b.createddate=(Select max(createddate) from Table2) and
a.tid not in (Select distinct tid from Table3);

问题是我知道这应该返回一些有效的输出,但它没有。如果我将 Select distinct tid from Table3 替换为硬编码值,例如 ('T001','T002' ,'T003','T004') 然后它工作正常并返回数据。

怎么了?我错过了什么吗?请帮忙。

【问题讨论】:

:手动运行查询Select distinct tid from Table3,如果该查询返回任何记录为null,则not in 将不返回任何结果 另外,删除 distinct,它对性能没有帮助。 Gaurav 查询返回数据。 RedFilter- 谢谢我已经删除了不同的。 @Ram: 如果 tid 不是主键,你能否将 NOT IN 查询重写为 NOT IN (Select tid from Table3 where tid is not null) 以确认 老歌但好人:asktom.oracle.com/pls/apex/… 【参考方案1】:

试试这个:

Select a.* from Table1 a, Table2 b
Where 
a.tid=b.tid and 
b.createddate=(Select max(createddate) from Table2) and
a.tid not in (Select tid from Table3 where tid is not null);

正如 cmets 中的所有人所提到的,如果 table3 中至少有一行 tid 为空值,则不会返回任何行。这是因为对于 Oracle,null 就像是在说“我不知道这个值是什么”。 Oracle 不能肯定地说您正在搜索的值肯定不在您的子选择中,因为它不知道这个“未知”值实际上是什么。此外,文档说它是这样工作的: http://docs.oracle.com/cd/B28359_01/server.111/b28286/conditions013.htm

另一种选择是将查询编写为:

Select a.* from Table1 a, Table2 b
Where 
a.tid=b.tid and 
b.createddate=(Select max(createddate) from Table2) and
not exists (Select null from Table3 t3 where t3.tid = a.tid);

null 的处理是 not exists 和 not in 之间的主要区别之一。

【讨论】:

:我假设同样的事情并要求他在 cmets 中做同样的事情以确认,但正如他所说,tid 返回数据:( Craig,Gaurav 是的,就是这样。一旦我在子查询中添加 tid is not null ,它就起作用了。特别感谢克雷格的解释。 @GauravSoni - 问题在于 NOT IN 工作方式的微妙之处。如果 Table3 中有任何行的 tid 为空,那么无论其他数据是什么,他的原始查询将始终不返回任何行。 @Craig:我想用 Ram 找出同样的事情,否则你的解释说明一切:) +1【参考方案2】:

您的查询,稍作改写:

Select a.*
from Table1 a join
     Table2 b 
     on a.tid=b.tid 
where b.createddate=(Select max(createddate) from Table2) and
      a.tid not in (Select distinct tid from Table3)

这告诉我,Table2 中创建日期最长的 tid 在 Table3 中。

要对此进行测试,请从 table2 获取最大创建日期。然后获取table1中与这个最大值对应的所有记录。你会发现这些也在table3中。

如果我不得不推测,您可能想要 Table2 中每个表的最大创建日期,而不是总体最大值。

顺便说一句,在 Oracle(和大多数其他数据库)中,最后一个子查询中的 distinct 是多余的。在这种情况下,数据库应该足够智能以删除重复项。

【讨论】:

Gordon no,Table2 中创建日期最长的 tid 不在 Table3 中。这就是令人费解的地方。

以上是关于NOT IN 运算符问题 Oracle的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别