6

私が使用しているiBatisSQLServer

クエリのページングにオフセットと制限を使用するための最良の方法は何ですか?

たぶん私は列を追加しますROW_NUMBER() OVER (ORDER BY Id) AS RowNumが、これは単純なクエリのデータアクセスを妨げるだけです。選択の和集合を使用する場合があります。これらのクエリを最適化する方法は?

4

1 に答える 1

1

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以降でのみ機能します-使用しているバージョンについては言及していません!

于 2012-06-12T08:54:39.113 に答える