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