Jak naśladować SELECT… LIMIT, OFFSET w OpenEdge SQL?
W większości implementacji SQL powszechną rzeczą jest możliwość wyboru podzbioru „przesuwnych okien” wszystkich wierszy zwracanych w zapytaniu. Typowym przypadkiem użycia jest paginacja. Załóżmy na przykład, że mam stronę wyszukiwania z 10 wynikami na każdej stronie. Dla wdrożeń, które obsługująLIMIT
iOFFSET
słowa kluczowe, zapytanie używane do zwracania wyników dla każdej strony byłoby następujące: strona, której użyjeszSELECT ... LIMIT 10 OFFSET 0
, strona 2 użyłabySELECT ... LIMIT 10 OFFSET 10
, strona 3 użyjeSELECT ... LIMIT 10 OFFSET 20
itd. (zauważ, żeOFFSET
zaczyna działać przedLIMIT
).
W każdym razie próbuję naśladować tę funkcjonalność w silniku SQL OpenEdge. Już to zrozumiałemSELECT TOP
jest w zasadzie równoważnyLIMIT
, jednak nie mogę znaleźć niczego podobnegoOFFSET
(Nie sądzę, że istniejedokładny odpowiednik). SQL Server i Oracle również nie posiadająOFFSET
, ale mają pseudokolumnęROWCOUNT
iROWNUM
, odpowiednio, które mogą być użyte do naśladowania zachowania przy użyciu zagnieżdżonych selekcji (patrztutaj itutaj).
w10.2B SQL Reference doc, str. 49 znajduje się podrozdział zatytułowanyKlauzula TOP to mówi na dole
SELECT TOP
jest funkcjonalnym odpowiednikiem OracleROWNUM
funkcjonalność. Zauważ, żeSELECT TOP
jest definiowany po prostu jako ograniczenie rozmiaru zestawu wyników, a optymalizator określa, jak wykorzystać ten limit w celu uzyskania najlepszego dostępu do danych. A zatem,SELECT TOP
nie ma wszystkich „reguł proceduralnych” używanych do zdefiniowania znaczenia WyroczniROWNUM
wyrażenie.
Jednak wydaje się, że jest to niedokładne, zgodnie zTOP
Składnia nie może być używana jako predykatROWNUM
może (np. nie mogę powiedziećSELECT * FROM Customer WHERE TOP > 5 AND TOP < 10
). WięcTOP
jestnie funkcjonalnie równoważnyROWNUM
.
Czy jest jakiś sposób naśladowaniaOFFSET
, czy nie mam szczęścia?