可能な大きな結果セットのサブセットのみを表示するナビゲーションパネルを作成する必要があります。このサブセットは、結果のレコードセットの前に20レコード、後に20レコードです。ナビゲーションパネルで結果をナビゲートするときに、ROWNUMを使用してスライディングウィンドウデザインを適用し、次のサブセットを取得します。私の質問は、OracleのROWNUMは、必要な行を抽出する前にテーブル全体を構築するのでしょうか。それとも、必要な行だけを生成するのに十分インテリジェントですか?私はグーグルで検索しましたが、これについての説明が見つかりませんでした。
5 に答える
あなたの解決策は(ボブが正しく指摘したように)機能しませんが、あなたはあなたが望むことをするために使うことができますrow_number()
:
SELECT col1,
col2
FROM (
SELECT col1,
col2,
row_number() over (order by some_column) as rn
FROM your_table
) t
WHERE rn BETWEEN 10 AND 20
このソリューションには、必要に応じて別の基準で最終結果を注文できるという追加の利点があることに注意してください。
編集:最初の質問に答えるのを忘れました:
上記のソリューションでは、はい、Oracleは正しい番号を見つけるために完全な結果を作成する必要があります。
11g以上では、クエリキャッシュを使用してクエリを改善できる可能性があります。
これを行うための pre-analytic-function メソッドは次のようになります。
select col1, col2 from (
select col1, col2, rownum rn from (
select col1, col2 from the_table order by sort_column
)
where rownum <= 20
)
where rn > 10
この場合、Oracle オプティマイザーは、内部クエリを満たすために上位 20 行を取得するだけでよいことを認識します。おそらくすべての行を調べる必要がありますが (たとえば、並べ替えを完全に回避できるように並べ替え列にインデックスが付けられている場合を除きます)、すべての行を完全に並べ替える必要はありません。
質問のタイトルについて。
http://www.orafaq.com/wiki/ROWNUMおよびTom Kyte による詳細な説明を参照してください。
質問の目的について。
これはあなたが探しているものでなければなりません: Paging with Oracle
あなたのデザインはあなたが計画したようにうまくいくとは思いません。Oracleは、クエリによって生成された順序でROWNUMに値を割り当てます。生成された最初の行にはROWNUM = 1が割り当てられ、2番目の行にはROWNUM=2が割り当てられます。最初の20行を返すため、次のようなクエリを作成した場合
SELECT *
FROM MY_TABLE
WHERE ROWNUM >= 21 AND
ROWNUM <= 40
ROWNUM> = 21の行が存在するためには、クエリは最初にROWNUM <= 20のすべての行を返す必要があるため、行は返されません。
これがお役に立てば幸いです。
古い質問ですが、これを試してみてください - http://www.inf.unideb.hu/~gabora/pagination/results.html