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的主要内容,如果未能解决你的问题,请参考以下文章