2012年以降、SQL Serverのドキュメントは、それらがサポートすることを示しています OFFSET..FETCH
LIMIT
の代わりに使用しようとしています。
以下はPostgreSQLで正常に動作し、結果セットをサンプリングします。
SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;
しかし、SQL Serverでは、
Msg 153, Level 15, State 2, Line 4
Invalid usage of the option FIRST in the FETCH statement.
何が起きてる? SQL Serverは標準化されたOFFSET
.. FETCH
をサポートしていますか?
SQL Serverは、OFFSET
句とFETCH
句をORDER BY
句の一部として実装しました。これは、他の回答で指摘され、それらのドキュメントに記載されています。
反対側のSQL標準には、これらの句の両方が独立しています。
<query expression> ::=
[ <with clause> ] <query expression body>
[ <order by clause> ] [ <result offset clause> ] [ <fetch first clause> ]
誰かがこの機能を標準に完全に準拠して実装することを望む場合、接続チャネルを通じていつでもSQL Serverチームに要求を出すことができます。実際、MSはコメントしている-オフセットとフェッチに関する別の要求で:
接続アイテム: SQL Denali:合計行カウンターを
SELECT
ステートメントに追加 -by Alexey Rokhin回答:2010年11月24日11:34にマイクロソフトが投稿
OFFSET/FETCH
がORDER BY
を必要とするという要件は、このリリースの制限です。ANSI SQL標準(SQL:2011)では、新しいOFFSET/FETCH
句が提案されています。ORDER BY
はオプションです。 SQL Serverの制限は、OFFSET
を予約キーワードにしないとオプションの構文を処理できないパーサーテクノロジの制限に関係しています。 将来的には削除される可能性があります。今に関して...
それまでは、特定のORDER BY
なしでOFFSET
とFETCH
を使用したい場合の回避策は、「何もしない」というorder by句を追加することです。例:
SELECT
...
ORDER BY (SELECT NULL)
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;
OFFSET
..FETCH
に関するドキュメントの最上部で述べたように
OFFSET-FETCH句は、結果セットから結果のウィンドウまたはページのみをフェッチするオプションを提供します。 OFFSET-FETCHは、ORDER BY句でのみ使用できます
...
OFFSETおよびFETCH句を使用するには、ORDER BYが必須です。
そう、
SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
ORDER BY t.[x] /* <-- ADD ME TO BE HAPPY */
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;
単純なLIMIT
の場合はそれほど実用的ではありませんが、それが TOP
を使用したい場合に適しています。
参照 によると、OFFSET
句はSQL ServerのORDER BY
の一部です。また、ROWS
仕様の後にOFFSET
キーワードを追加する必要があります。
SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
ORDER BY x
OFFSET 0 ROWS
FETCH FIRST 1 ROWS ONLY;