Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

Каков синтаксис для функционального аналога SELECT TOP(N) в Oracle?

#sql #sql_server #oracle #plsql_developer


Предположим, есть таблица TABLE

ID | DEF
 1 | Один
 2 | Два
 3 | Три
 4 | Четыре


Тогда запрос в MS SQL Server

SELECT TOP(2) * FROM TABLE ORDER BY ID DESC


Даст нам выдачу:

ID | DEF
 4 | Четыре
 3 | Три


А аналогичный запрос в Oracle (аналог, который мне предложился в интернетах)

SELECT * FROM TABLE WHERE ROWNUM <= 2 ORDER BY ID DESC


Даст нам выдачу:

ID | DEF
 2 | Два
 1 | Один


Как получить действительно аналогичный по функциональности синтаксис для Oracle?
    


Ответы

Ответ 1



В оракле до 11-й версии включительно - через подзапрос с row_number: select * from (select t.*, row_number() over (order by id desc) rn from t) where rn <= 2 В 12-й версии появился синтаксис для первых N строк с LIMIT и OFFSET, почти как в постгресе (запрос скопипастил из интернета, 12-го оракла под рукой нет): select * from t order by id desc OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;

Ответ 2



Дело в том, что Oracle сначала выполняет условие where и только потом производит сортировку. То есть в вашем случае сначала остаются строки с id in (1, 2) и потом они и сортируются. Для получения аналогичного результата сначала надо отсортировать все данные и потом обернув запрос получить нужное количество строк: SELECT * FROM (SELECT * FROM TABLE ORDER BY ID DESC) WHERE ROWNUM <= 2

Ответ 3



Вам придётся воспользоваться подзапросом. Т.е. ваш запрос с основными условиями и сортировкой перенесите в подзапрос, а ограничение на выбор поставьте в секцию WHERE внешнего запроса. SELECT * FROM ( SELECT * FROM TABLE ORDER BY ID DESC ) WHERE ROWNUM <= 2

Комментариев нет:

Отправить комментарий