Вопрос по openedge, progress-4gl – Как имитировать SELECT ... LIMIT, OFFSET в OpenEdge SQL?

3

Обычно в большинстве реализаций 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или мне не повезло?

Я думаю, это не поддерживается в Progress SQL. Можно ли использовать PK-ID, чтобы найти, какая строка была выбрана в последнем SELECT TOP 10? Чем вы можете написать в следующем SELECT что-то вроде SELECT * FROM Customer WHERE Cutsomer.CustID & gt; lastcustomerid ТОП 10 ... firhang
@firhang Да, вы правы, что это не поддерживается. Решение PK работает, когда запросы строятся с использованием PK.and Я хочу получить их в порядке PK, но так будет не всегда, поэтому он не работает для общего решения (что мне и нужно). Спасибо! Abe Voelker

Ваш Ответ

1   ответ
4

OFFSET and FETCH clauses в SQLSELECT запросы; версии OpenEdge ниже 11.2 не поддерживаютOFFSET/FETCH.

От11.2 документация на продукцию & quot; Справочник по SQL & quot; документ:

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.

Стоит отметить, чтоTOP and OFFSET/FETCH clauses are mutually exclusive - TOP не может быть использован в запросе, который используетOFFSET или жеFETCH.

Example queries from the documentation:

Пропустите первые 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;

Похожие вопросы