FirebirdSQL logo
 COMMENTSОператоры процедурного SQL (PSQL) 

Совместное использование FIRST …​ SKIP и ROWS

Нельзя использовать ROWS вместе с FIRST/SKIP в одном и том же операторе SELECT, но можно использовать разный синтаксис в разных подзапросах.

Использование ROWS в UNION

При использовании ROWS с выражением UNION, он будет применяться к объединённому набору данных, и должен быть помещён после последнего SELECT.

При необходимости ограничить возвращаемые наборы данных одного или нескольких операторов SELECT внутри UNION, можно воспользоваться следующими вариантами:

  1. Использовать FIRST/SKIP в этих операторах SELECT. Необходимо помнить, что нельзя локально использовать выражение ORDER BY в SELECT внутри UNION – только глобально, ко всему суммарному набору данных;

  2. Преобразовать SELECT в производные таблицы с выражениями ROWS.

Примеры

Ниже приведены примеры, ранее использованные для демонстрации FIRST/SKIP.

Следующий запрос вернёт первые 10 имён из таблицы PEOPLE (имена также будут отсортированы, см. ORDER BY).

SELECT id, name
FROM People
ORDER BY name ASC
ROWS 1 TO 10

или его эквивалент

SELECT id, name
FROM People
ORDER BY name ASC
ROWS 10

Следующий запрос вернёт все записи из таблицы PEOPLE, за исключением первых 10 имён:

SELECT id, name
FROM People
ORDER BY name ASC
ROWS 11 TO (SELECT COUNT(*) FROM People)

А этот запрос вернёт последние 10 записей (обратите внимание на скобки):

SELECT id, name
FROM People
ORDER BY name ASC
ROWS (SELECT COUNT(*) - 9 FROM People)
TO (SELECT COUNT(*) FROM People)

Этот запрос вернёт строки 81-100 из таблицы PEOPLE:

SELECT id, name
FROM People
ORDER BY name ASC
ROWS 81 TO 100
См. также:

"FETCH, OFFSET", "FIRST, SKIP".

FETCH, OFFSET

Предложения FETCH и OFFSET являются SQL:2008 совместимым эквивалентом предложениям FIRST/SKIP и альтернативой предложению ROWS.Предложение OFFSET указывает, какое количество строк необходимо пропустить.Предложение FETCH указывает, какое количество строк необходимо получить.

Предложения OFFSET и FETCH могут применяться независимо уровня вложенности выражений запросов.

Синтаксис
SELECT <columns> FROM ...
  [WHERE ...]
  [ORDER BY ...]
  [OFFSET <offset-fetch-expression> {ROW | ROWS}]
  [FETCH {FIRST | NEXT} [ <offset-fetch-expression> ] { ROW | ROWS } ONLY]

<offset-fetch-expression>  ::=
    <integer-literal>
  | <query-parameter>
Table 1. Параметры предложений OFFSET и FETCH
Параметр Описание

integer-literal

Целочисленный литерал

query-parameter

Парамер запрос.? в DSQL и :paramname в PSQL

Note
  • Firebird не поддерживает указание FETCH в процентах, определённое в стандарте.

  • Firebird не поддерживает предложение FETCH с опцией WITH TIES, которая определена в стандарте.

  • FIRST …​ SKIP и ROWS являются нестандартными альтернативами.

  • Предложения OFFSET и/или FETCH не могут быть объединены с предложениями ROWS или FIRST/SKIP в одном выражении запроса.

  • Выражения, ссылки на столбцы и т.д. недопустимы в любом из предложений.

  • В отличие от предложения ROWS, предложения OFFSET и FETCH допустимы только в операторе SELECT.