2009-10-19 60 views
0

我有這樣的查詢:查詢: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中

+7

請發送替代查詢。 – markus 2009-10-19 19:11:06

+0

你的意思是沒有數據返回零行嗎?而選擇*返回> 0行? – ongle 2009-10-19 19:24:23

+0

目標是使用同一個表中的最大日期值? – 2009-10-19 19:35:55

回答

0

是指明MyDate在返回的行始終爲NULL? SQL(至少有一些實現,我不熟悉Oracle)會從結果集中刪除由完全NULL值組成的行。

+0

更有趣的是,答案是否定的。當我執行select *時,MyDate列有數據。謝謝你的評論。 – 2009-10-19 20:05:35

0

對於下面加入我檢查: 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>) 
+0

我所有的列都有值。然而,當插入硬編碼值時,它開始返回一些數據...嗯 - 我想我需要更多的工作。 – 2009-10-19 21:00:30

1

假設你使用的不是一個草率的事務隔離級別,並且該數據不執行之間改變,你所描述不應該發生,什麼可能是一個錯誤。如果發生一列的覆蓋索引,選擇一列與選擇所有列的查詢計劃可能會非常不同,因此錯誤會出現在一個查詢中而不是另一個查詢中的事實並不令人意外。 (同樣,如果沒有錯誤,但允許髒讀取,則可以從一個計劃中獲取它們,但不能從另一個計劃中獲取它們)。您可以嘗試重建索引,這些查詢會使用錯誤結果。您還可以看到,如果您使用的是Oracle錯誤修復列表中的「錯誤結果」這樣的短語中頻繁出現的任何功能,例如this one

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; 

是有趣的,看看這個查詢有同樣的問題。