9

这是我的查询:

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 中的最后一行不在(从 Table3 中选择不同的 tid);如果我将 Select distinct tid from Table3 替换为 ('T001','T002','T003','T004') 等硬编码值,则它可以正常工作并返回数据。

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

4

2 回答 2

24

试试这个:

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

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

于 2012-07-18T19:14:47.433 回答
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)

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

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

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

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

于 2012-07-18T18:51:29.263 回答