查询:SELECT *回报数据,但是选择列没有返回结果
我有这样的查询:查询:SELECT *回报数据,但是选择列没有返回结果
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)
有谁知道为什么会这样happenning?列本身是一个日期,而DB是Oracle 10g中
是指明MyDate在返回的行始终为NULL? SQL(至少有一些实现,我不熟悉Oracle)会从结果集中删除由完全NULL值组成的行。
更有趣的是,答案是否定的。当我执行select *时,MyDate列有数据。谢谢你的评论。 – 2009-10-19 20:05:35
对于下面加入我检查: 1)你在你的子查询与不同类型的? 2)你加入的任何数字列是否为空,这似乎会导致问题。
加入看...
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>)
我所有的列都有值。然而,当插入硬编码值时,它开始返回一些数据...嗯 - 我想我需要更多的工作。 – 2009-10-19 21:00:30
假设你使用的不是一个草率的事务隔离级别,并且该数据不执行之间改变,你所描述不应该发生,什么可能是一个错误。如果发生一列的覆盖索引,选择一列与选择所有列的查询计划可能会非常不同,因此错误会出现在一个查询中而不是另一个查询中的事实并不令人意外。 (同样,如果没有错误,但允许脏读取,则可以从一个计划中获取它们,但不能从另一个计划中获取它们)。您可以尝试重建索引,这些查询会使用错误结果。您还可以看到,如果您使用的是Oracle错误修复列表中的“错误结果”这样的短语中频繁出现的任何功能,例如this one。
稍微偏离主题,但你的查询将被更好地写成:
select MYDATE
from (Select plan.*,
max(pln_es.seq) Over (id,career,nbr) max_seq
from plan
where id = '0003')
where seq = max_seq;
是有趣的,看看这个查询有同样的问题。
请发送替代查询。 – markus 2009-10-19 19:11:06
你的意思是没有数据返回零行吗?而选择*返回> 0行? – ongle 2009-10-19 19:24:23
目标是使用同一个表中的最大日期值? – 2009-10-19 19:35:55