2014-05-13 44 views
8

當我運行此查詢時,結果未正確排序。當兩次使用同一列時Oracle不能正確排序

SELECT 
    SYSDATE - datecolumn a, 
    SYSDATE - datecolumn sortcolumn 
FROM atable 
ORDER BY sortcolumn 

產地:

2576.780243055555555555555555555555555556 
2586.297013888888888888888888888888888889 
2342.294479166666666666666666666666666667 
2617.297476851851851851851851851851851852 
2624.855104166666666666666666666666666667 
2624.855138888888888888888888888888888889 
2624.854236111111111111111111111111111111 
2372.296643518518518518518518518518518519 
2645.257800925925925925925925925925925926 
2403.294756944444444444444444444444444444 
2676.297696759259259259259259259259259259 

當第一行(SYSDATE - datecolumn一)被刪除,一切工作正常。這有什麼特別的原因嗎?

+0

嘗試'TO_NUMBER(SYSDATE - datecolumn)as sort_column'。我認爲你的SQL排序不是數字。 –

+0

有趣的行爲(我可以在Oracle 11gR2上進行確認)。有許多解決方法,但很高興知道它是錯誤還是功能。 – GoranM

+0

在我的instaince上都按預期工作,試着重建你的表(當表損壞時我面臨oracle問題)或提供完整的測試用例(用表創​​建和填充) –

回答

4

這似乎是一個錯誤。這種行爲看起來類似於錯誤8675087,它應該在11.2.0.2中修復 - 實際上我無法爲此重現測試用例。但我仍然看到你的行爲在該版本(在SQL Fiddle)和11.2.0.3,所以這是類似的,但不完全一樣...

如果這是導致你一個真正的問題,你找不到你很滿意的解決方法(比如交換列順序;如果你的sortcolumn是第一個使用sysdate的表達式,它似乎沒問題,但在真正的查詢中交換列可能不方便),那麼你應該向Oracle提出服務請求。

1

迷人的錯誤。轉載於11.2.0.2。

select * from (
    select sysdate - db_created_on a 
     ,sysdate - db_created_on b 
    from members 
) order by b; 

(結果不正確排序)

select * from (
    select sysdate - db_created_on a 
     ,sysdate - db_created_on b 
    from members 
) order by a; 

(結果正確排序)

我能想到的最好的解決方法:

如果查詢被包裹在一個子查詢,即使發生是爲SYSDATE使用標量子查詢,這似乎會導致它正確排序:

select sysdate - db_created_on a 
     ,(select sysdate from dual) - db_created_on b 
from members 
order by b;