ページ結果
OFFSET-FETCH と呼ばれる ORDER BY 句の拡張機能を使用すると、クエリによって選択した範囲の行のみを返すことができます。 開始点 (オフセット) と値を指定して、返す行数 (フェッチ値) を指定することができるようになります。 この拡張機能により、結果をページングする便利な手法が提供されます。
一度に 1 "ページ" ずつ (ページに対して任意の数を使用して) 行を返したい場合、OFFSET-FETCH 句を含む各クエリは、他のクエリとは独立して実行されることを考慮する必要があります。 サーバー側の状態は保持されず、クライアント側コードを使用して、結果セットを通じて位置を追跡する必要があります。
OFFSET-FETCH 構文
(技術的には ORDER BY 句の一部である) OFFSET-FETCH 句の構文は、次のとおりです。
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY]
OFFSET-FETCH の使用
OFFSET-FETCH を使用するには、次の例のように、開始 OFFSET 値 (0 でもかまいません) と返す行数 (省略可能) を指定します。
この例では、最初の 10 行が返された後、ListPrice に基づいて製品データの次の 10 行が返されます。
SELECT ProductID, ProductName, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC
OFFSET 0 ROWS --Skip zero rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10
製品データの "次の" ページを取得するには、OFFSET 句を使用してスキップする行数を指定します。
SELECT ProductID, ProductName, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC
OFFSET 10 ROWS --Skip 10 rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10
構文の定義では OFFSET 句が必須であることがわかりますが、FETCH 句は必須ではありません。 FETCH 句を省略すると、OFFSET の後のすべての行が返されます。 また、FIRST および NEXT と同様に、ROW および ROWS キーワードは交換可能であることもわかります。これによってより自然な構文が可能になります。
特にデータのページ間を移動するときに、結果の精度を確保するには、一意の順序が指定され、決定論的な結果が生成される ORDER BY 句を作成することが重要です。 SQL Server のクエリ オプティマイザーのしくみにより、行の範囲が決定論的でない限り、1 つの行が複数のページに出現する可能性が技術的に存在します。