NOT IN运算符问题Oracle

时间:2012-07-18 18:46:41

标签: sql oracle plsql

这是我的问题:

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);

问题是我知道这应该返回一些有效的输出,但事实并非如此。问题是 a.tid中的最后一行没有(从表3中选择不同的tid); 如果我用表格3中的“T001”,“T002”等硬编码值替换Table3中的select distinct tid ,'T003','T004')然后它工作正常并返回数据。

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

2 个答案:

答案 0 :(得分:14)

试试这个:

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);

正如所提到的评论中的所有人一样,如果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);

空值的处理是不存在与不存在之间的主要区别之一。

答案 1 :(得分:0)

您的查询,略有改写:

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)

这告诉我的是表2中具有最大创建日期的tid在表3中。

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

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

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