Как имитировать SELECT ... LIMIT, OFFSET в OpenEdge SQL?
Обычно в большинстве реализаций SQL можно выбирать «скользящее окно». подмножество всех строк, возвращаемых в запросе. Обычный вариант использования для этого - нумерация страниц. Например, скажем, у меня есть страница поиска с 10 результатами на каждой странице. Для реализаций, которые поддерживаютLIMIT
а такжеOFFSET
ключевые слова, запрос, используемый для возврата результатов для каждой страницы, будет выглядеть следующим образом: первая страница будет использоватьSELECT ... LIMIT 10 OFFSET 0
страница 2 будет использоватьSELECT ... LIMIT 10 OFFSET 10
страница 3 будет использоватьSELECT ... LIMIT 10 OFFSET 20
и т. д. (обратите внимание, чтоOFFSET
вступает в силу доLIMIT
).
Во всяком случае, я пытаюсь имитировать эту функциональность в движке SQL OpenEdge. Я уже понял, чтоSELECT TOP
в основном эквивалентноLIMIT
Однако я не могу найти ничего похожего наOFFSET
(Я не думаю, что естьexact эквивалент). SQL Server и Oracle также не хватаетOFFSET
, но у них есть псевдоколонка под названиемROWCOUNT
а такжеROWNUM
соответственно, это может быть использовано для имитации поведения с помощью вложенных выборок (см.Вот а такжеВот).
в10.2B SQL Reference doc, p49 есть подраздел, озаглавленныйTOP clause что говорит внизу
SELECT TOP
is the functional equivalent of the Oracle ROWNUM
functionality. Note that SELECT TOP
is defined simply in terms of a
limit on the result set size, and the optimizer determines how to use
this limit for best data access. Thus, SELECT TOP
does not have all
the "procedural rules" used to define the meaning of the Oracle ROWNUM
phrase.
Тем не менее, это представляется неточным, так как в соответствии сTOP
синтаксис не может быть использован как предикатROWNUM
не могу (например, я не могу сказатьSELECT * FROM Customer WHERE TOP > 5 AND TOP < 10
). ТакTOP
являетсяnot функционально эквивалентноROWNUM
.
Есть ли способ имитироватьOFFSET
или мне не повезло?