2011-09-20 8 views
29

LIMITとOFFSETを使用するデータベース内のすべてのデータをソートする必要があります。このようなSQL(ORACLE):ORDER BYと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より前のバージョンでは、LIMITまたはOFFSETのキーワードはサポートされていません。

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を通じて行Nを取得したい場合は、次のようなものが必要だろうソートされた結果のMから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〜1000万行)に適しているでしょうか?たぶん、それはランク()で2深さ対3深さの選択についてですか?実際には、私は両方を試してみると思います。 –

+7

私は最初のアプローチが数msでより速く、2番目のアプローチが数秒で速かったことに気付いた方々のために、時間を追加する関数そのものであるのか、それともクエリの最適化を妨げているのかは分かりません。何とか複数のアプローチを見せてくれてありがとう! –