3

ほとんどの SQL 実装では、クエリで返されるすべての行の "スライディング ウィンドウ" サブセットを選択できるのが一般的です。これの一般的な使用例はページネーションです。たとえば、各ページに 10 件の結果がある検索ページがあるとします。LIMITおよびOFFSETキーワードをサポートする実装の場合、各ページの結果を返すために使用されるクエリは次のようになります: ページ 1 は を使用しSELECT ... LIMIT 10 OFFSET 0、ページ 2 は を使用しSELECT ... LIMIT 10 OFFSET 10、ページ 3 は を使用します(は の前に有効になるSELECT ... LIMIT 10 OFFSET 20ことに注意してください)。OFFSETLIMIT

とにかく、OpenEdge の SQL エンジンでこの機能を模倣しようとしています。SELECT TOP基本的に と同等であることはすでにわかっていLIMITますが、 に似たものは見つかりません (まったくOFFSET同等のものはないと思います)。SQL Server と Oracle にも はありませんが、ネストされた選択を使用して動作を模倣するために使用できる、それぞれおよび と呼ばれる疑似列があります (こちらこちらを参照)。OFFSETROWCOUNTROWNUM

10.2B SQL リファレンスドキュメントの p49 には、一番下にあるTOP 句というタイトルのサブセクションがあります。

SELECT TOPOracle のROWNUM 機能と機能的に同等です。SELECT TOPは、結果セット サイズの制限に関して単純に定義されており、最適なデータ アクセスのためにこの制限をどのように使用するかはオプティマイザによって決定されることに注意してください。したがって、オラクルの 句SELECT TOPの意味を定義するために使用されるすべての「手続き上の規則」があるわけではありません。ROWNUM

ただし、 の構文によれば、TOPcan のように述語として使用できないため、これは不正確なようですROWNUM(たとえば、 I can't say SELECT * FROM Customer WHERE TOP > 5 AND TOP < 10)。SoTOPは と機能的に同等ではありませんROWNUM

を模倣する方法はありますかOFFSET、それとも運が悪いのでしょうか?

4

1 に答える 1

6

OpenEdge 11.2では、SQLクエリにOFFSETandFETCH句のサポートが追加されました。SELECT11.2 より前のバージョンの OpenEdge はOFFSET/をサポートしていませんFETCH

11.2 製品ドキュメント「SQL リファレンス」ドキュメントから:

The OFFSET clause specifies the number of rows to skip, before starting to return rows
from the query expression. The FETCH clause specifies the number of rows to return,
after processing the OFFSET clause.

TOPand OFFSET/FETCH句は相互に排他的であることに注意してください。 orTOPを使用するクエリでは使用できません。OFFSETFETCH

ドキュメントからのクエリの例:

最初の 10 行をスキップし、残りの適格な行を返します。

SELECT OrderID,OrderDate,custID,filler
FROM dbo.Orders OFFSET 10;

スキップせずに最初の 10 行を返します。

SELECT OrderID,OrderDate,custID,filler
FROM dbo.Orders
ORDER BY OrderDate DESC, OrderID DESC
FETCH FIRST 10 ROWS ONLY;

クエリの結果セットで行 51 から 60 を返します。

SELECT OrderID,OrderDate,custID,filler
FROM dbo.Orders
ORDER BY OrderDate DESC, OrderID DESC
OFFSET 50 ROWS FETCH NEXT 10 ROWS ONLY;
于 2012-06-11T14:42:50.207 に答える