barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

вторник, 31 июля 2012 г.

Oracle: аналог LIMIT / TOP

Некоторым аналогом функционала 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.

1 комментарий: