查询:select *返回数据,但选择Column不返回结果

时间:2009-10-19 19:09:14

标签: sql oracle

我有这样的查询:

select pln.* 
  from plan pln 
 where pln.id = '0003'  
   and pln.seq = (select max(pln_es.seq)
                    from plan pln_es
                   where pln_es.id = pln.emplid
                     and pln_es.career =pln.career
                     and pln_es.nbr = pln.nbr
                     and pln_es.dt = pln.dt)

但是,如果我这样做(选择列...),使用相同的条件,它不会返回数据!对我毫无意义。

这是不返回结果的查询:

select pln.MYDATE
  from plan pln 
 where pln.id = '0003'  
   and pln.seq = (select max(pln_es.seq)
                    from plan pln_es
                   where pln_es.id = pln.emplid
                     and pln_es.career =pln.career
                     and pln_es.nbr = pln.nbr
                     and pln_es.dt = pln.dt)

有谁知道为什么会发生这种情况?列本身是Date,DB是Oracle 10g

5 个答案:

答案 0 :(得分:1)

假设您没有使用草率的事务隔离级别,并且数据在执行之间没有变化,那么您所描述的内容不应该发生,并且可能是一个错误。如果一列的覆盖索引恰好发生,那么选择一列与选择全部的查询计划可能会非常不同,因此错误将出现在一个查询而不是另一个查询中的事实并不令人意外。 (同样,如果没有错误,但是你允许脏读,你可能会从一个计划中获取它们而不是另一个计划。)你可以尝试重建索引使用的索引,这些索引会产生错误的结果。您还可以查看您是否正在使用this one等Oracle错误修复列表中“错误结果”一词附近经常出现的任何功能。

答案 1 :(得分:0)

返回的行中MYDATE是否始终为NULL? SQL(至少某些实现,我不熟悉Oracle)将从结果集中删除由完全NULL值组成的行。

答案 2 :(得分:0)

对于以下联接我会检查: 1)您在比较子查询中的不同类型吗? 2)您加入的任何数字列是否为null,这似乎会导致问题。

加入看......

pln_es.id = pln.emplid
and pln_es.career =pln.career
and pln_es.nbr = pln.nbr
and pln_es.dt = pln.dt

你也试过看到像这样的查询结果返回任何内容。

select pln.MYDATE
  from plan pln 
 where pln.id = '0003'  
   and pln.seq = (select max(pln_es.seq)
                    from plan pln_es
                   where pln_es.id = <insert hard coded value>
                     and pln_es.career =<insert hard coded value>
                     and pln_es.nbr = <insert hard coded value>
                     and pln_es.dt = <insert hard coded value>)

答案 3 :(得分:0)

稍微偏离主题,但您的查询会更好地写为:

select MYDATE 
  from (Select plan.*,
               max(pln_es.seq) Over (id,career,nbr) max_seq
          from plan
         where id = '0003')
 where seq = max_seq;

有趣的是看看这个查询是否有同样的问题。

答案 4 :(得分:0)

在被选中的特定列上有索引时,会发生这种情况,并且对于想要更好的单词,索引是“损坏”。 SQL 返回存储在索引中的值,而不是存储在行中的值。删除并重新创建该索引解决了该问题。