2015-10-05 71 views
3

我正在努力獲取基於rownum的數據。當我執行下面的查詢來獲得基於rownum 1 to 4的結果時,它工作正常。oracle中rownum的祕密

SELECT ROWNUM TOTAL,MI.* FROM (SELECT USER_ID,CUSTOMER_NAME FROM ELEC_AUTO_MERC 
    ORDER BY CREATION_DATE DESC) MI WHERE ROWNUM BETWEEN 1 AND 4; 

但是,當我執行相同的查詢,以獲得從rownum 2 to 4結果,那麼它是不工作,它不返回任何東西。

SELECT ROWNUM TOTAL,MI.* FROM (SELECT USER_ID,CUSTOMER_NAME FROM ELEC_AUTO_MERC 
    ORDER BY CREATION_DATE DESC) MI WHERE ROWNUM BETWEEN 2 AND 4; 

解決方法是,當我使用一個以上的SELECT語句,然後它工作正常,但我不認爲這是隻使用了ROWNUM選擇多次不錯的辦法。

SELECT * FROM (SELECT ROWNUM TOTAL,MI.* FROM (SELECT USER_ID,CUSTOMER_NAME FROM ELEC_AUTO_MERC 
    ORDER BY CREATION_DATE DESC) MI) WHERE TOTAL BETWEEN 2 AND 4; 

你能幫我創建優化查詢嗎?

回答

3

ROWNUM很奇怪,因爲它可以作爲查詢中條件的一部分進行評估 - 但是如果該行未能通過該過濾器,則分配的ROWNUM值可以再次用於下一行。

這樣做的一個重要影響是,如果使用排除ROWNUM值爲1的任何條件,則永遠不會得到匹配結果。第一行要對這種情況進行測試將是第一行;但然後它會通過測試,所以下一行將被視爲第1行;等等。

所以你的條件ROWNUM BETWEEN 2 AND 4永遠不會是真的。

您找到的解決方法是傳統方法。另一個辦法是使用分析功能排名中的行,然後在排名過濾器,例如:

SELECT MI.* FROM (
    SELECT USER_ID,CUSTOMER_NAME, RANK() OVER (ORDER BY CREATION_DATE DESC) AS the_rank 
    FROM ELEC_AUTO_MERC 
) MI 
WHERE the_rank BETWEEN 2 AND 4; 

一些分析功能 - RANK,DENSE_RANK和ROW_NUMBER - 可以用於此目的,並且將略有產生不同的結果,特別是如果有關係。查看文檔。

+0

非常感謝戴夫爲此做出的澄清.. –