n行のテーブルがあるとします。動的サイズのページごとにデータを取得するためのOracle SQLクエリ?
私はvariblesを設定したい:
numberOfPages = 10(ページ・サイズは、動的でなければなりません)
pageToGet = 2;
テーブルのページサイズと合計行数を指定せずに目的のページを取得できますか?
n行のテーブルがあるとします。動的サイズのページごとにデータを取得するためのOracle SQLクエリ?
私はvariblesを設定したい:
numberOfPages = 10(ページ・サイズは、動的でなければなりません)
pageToGet = 2;
テーブルのページサイズと合計行数を指定せずに目的のページを取得できますか?
NTILE()
をお試しください:オラクルのページネーションクエリのためにそこに
WITH paginated AS (
SELECT
columns,
NTILE(numberOfPages) OVER (ORDER BY what?) AS pageNum
FROM table
)
SELECT
columns
FROM paginated
WHERE pageNum = pageToGet
記事が充実していますが、私は一般的に使用します。
必要とされていることにより、select * from (
select a.*, rownum r
from (
select *
from your_table
where ...
order by ...
) a
where rownum <= :upperBound
)
where r >= :lowerBound;
注文が、私は通常、インデックス付きの列を使用し、 rownumの使用は、Oracleがストップキーの最適化を使用できることを意味します。だから、必ずしもフルテーブルスキャンを行うつもりはありません。
ページあたり100行あり、ページ3が必要な場合、lowerBound = 301およびupperBound = 400です。
NTILEをAndriyMとして使用することは、ページサイズを絶対に指定できない場合には良い答えですが、大規模なテーブルでは明確なパフォーマンスヒットが発生すると思います。主に私がこれを投稿した理由は、パフォーマンスを比較し、動的ページサイズがあなたのアプリにとって理にかなっているかどうかを見ることができるからです。
注文を行うことは必須ですか?テーブルは巨大なので、並べ替えを適用したくありません。 – omrid
@omrid:はい、 'ORDER BY'節は' NTILE'に必須です。 SQL Serverでは、この場合は '... ORDER BY(SELECT 1)... 'のように'任意の '順序を指定する必要がありますが、Oracleでは' ORDER BY 1.23'または 'ORDER BY 'abc''です。私は確信していません、申し訳ありません。 –
+1いいね、しばらく使っていないのを見たことがありません! – tbone