2011-09-20 66 views
29

我想要通過屬性中的所有數據進行排序,並且僅在使用LIMIT和OFFSET之後進行。SQL(ORACLE):ORDER BY and LIMIT

查詢是這樣的:

SELECT select_list 
    FROM table_expression 
    [ ORDER BY ... ] 
    [ LIMIT { number | ALL } ] [ OFFSET number ] 

我知道,因爲它已經找到了排序結果的第一行的row_count排序儘快結束。在調用LIMIT和OFFSET之前,我可以對所有數據進行排序嗎?

+0

相關:http://stackoverflow.com/q/470542/1461424 – Krumia

回答

54

在12.1之前,Oracle不支持LIMITOFFSET關鍵字。如果你想在結果集中的M個檢索行N,你需要這樣的:

SELECT a.* 
    FROM (SELECT b.*, 
       rownum b_rownum 
      FROM (SELECT c.* 
        FROM some_table c 
       ORDER BY some_column) b 
     WHERE rownum <= <<upper limit>>) a 
WHERE b_rownum >= <<lower limit>> 

或使用分析功能:

SELECT a.* 
    FROM (SELECT b.*, 
       rank() over (order by some_column) rnk 
      FROM some_table) 
WHERE rnk BETWEEN <<lower limit>> AND <<upper limit>> 
ORDER BY some_column 

這些方法的執行將排序給你行×N通過M的排序結果。

在12.1及更高版本,可以使用OFFSET和/或FETCH [FIRST | NEXT]運營商:

SELECT * 
    FROM some_table 
ORDER BY some_column 
OFFSET <<lower limit>> ROWS 
    FETCH NEXT <<page size>> ROWS ONLY 
+2

也許不容易回答,因爲它是問:對於非常大的表格(1-10萬行),哪種方法可能更好?也許它是關於3級深度選擇與2級深度級別()?其實,我想我會試試看。 –

+7

對於任何想知道的人,我發現第一種方法在幾秒鐘內對我來說更快,第二種方法在幾秒鐘之內。我不確定它是否會增加時間,或者阻止任何查詢優化。無論如何,感謝您展示多種方法! –