#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
Комментариев нет:
Отправить комментарий