Некоторым аналогом функционала LIMIT / TOP по ограничению числа возвращаемых строк является псевдостолбец "rownum", представляющий собой номер строки в результирующей выборке. Таким образом, запрос:
SELECT * FROM abc WHERE rownum<=10
аналогичен запросу:
SELECT * FROM abc LIMIT 10
в MySQL / PostgreSQL, или:
SELECT TOP 10 * FROM abc
в MS SQL.
Правда, у такого подхода есть важная особенность: ограничение выборки производится раньше, чем сортировка с помощью ORDER BY, в отличие от конструкции LIMIT в MySQL / PostgreSQL. Т.е.:
SELECT * FROM abc WHERE rownum<=10 ORDER BY a
вовсе не аналогичен вызову
SELECT * FROM abc ORDER BY a LIMIT 10
в других СУБД, т.к. оракл проведет сначала выборку первых 10 значений, а потом уже отсортирует их по столбцу "a". Чтобы ограничение выборки выполнялось уже после сортировки, необходимо использовать вложенный запрос:
SELECT * FROM (SELECT * FROM abc ORDER BY a) WHERE rownum<=10Альтернативой такому, мягко говоря, несимпатичному запросу может быть использование функции ROW_NUMBER.
Спасибо!
ОтветитьУдалить