私が使用しているiBatis
とSQLServer
、
クエリのページングにオフセットと制限を使用するための最良の方法は何ですか?
たぶん私は列を追加しますROW_NUMBER() OVER (ORDER BY Id) AS RowNum
が、これは単純なクエリのデータアクセスを妨げるだけです。選択の和集合を使用する場合があります。これらのクエリを最適化する方法は?
私が使用しているiBatis
とSQLServer
、
クエリのページングにオフセットと制限を使用するための最良の方法は何ですか?
たぶん私は列を追加しますROW_NUMBER() OVER (ORDER BY Id) AS RowNum
が、これは単純なクエリのデータアクセスを妨げるだけです。選択の和集合を使用する場合があります。これらのクエリを最適化する方法は?
ibatisについては何も知りませんが、SQLでこれを行うことができると思います。
私があなたを正しく理解しているなら、あなたはselectステートメントの結果またはいくつかのselectステートメントの結合を取得したいと思うでしょう。
私はそれを次のようにします。これは、たとえばストアドプロシージャである可能性があり、オフセットと制限の値が0より大きいことを確認するために、おそらくいくつかの健全性チェックが必要です。このようなことを行うことになった場合は、必ず*
列名に置き換えてください。それも!
ユニオンの例を次に示します。
DECLARE @offset INT;
DECLARE @limit INT;
WITH cte
AS (SELECT t.*,
Row_number() OVER (ORDER BY Id) AS RowNum
FROM (SELECT *
FROM Table1
UNION
SELECT *
FROM Table2) t)
SELECT *
FROM cte
WHERE RowNum BETWEEN @offset AND @offset + @limit
基本的に、私が行ったことは、あなたがあなたのケースで起こる可能性があるとあなたが言ったように、2つのクエリの結合から新しいテーブルを導き出しました。次に、 CTEの結果に行番号の列を追加し、で指定さ@Offset
れた行のみを選択して、@limit + @offset
要求した行のみを取得します。
たとえば、設定@offset = 50
と、の場合、結果は50〜100になります( over句@limit = 50
で指定された基準に従って並べ替えられます) 。Row_number
(これがあなたが探していたようなものだったといいのですが!)
編集:これはSQL Server 2005以降でのみ機能します-使用しているバージョンについては言及していません!