Есть ли способ заставить Oracle
запрос вести себя так, как будто он содержит MySQL limit
предложение?
В MySQL
, я могу сделать это:
select *
from sometable
order by name
limit 20,10
чтобы получить 21-й по 30-й ряды (пропустите первые 20, дайте следующие 10). Строки выбираются после order by
, так что это действительно начинается с 20-го имени в алфавитном порядке.
В Oracle
, единственное , что люди уже является rownum
псевдо-столбец, но он оценивается до order by
того , что означает следующее:
select *
from sometable
where rownum <= 10
order by name
вернет случайный набор из десяти строк, упорядоченных по имени, что обычно не то, что я хочу. Это также не позволяет указывать смещение.
sql
oracle
pagination
sql-limit
Матье Лонгтин
источник
источник
ORDER BY
. Вот и весь смысл заказа в первую очередь. Если базовые данные изменяются, и ваш набор результатов изменяется из-за этого, то почему бы не показать пользователю обновленные результаты вместо устаревшей информации? Кроме того, государственное управление - это чума, которую следует избегать, насколько это возможно. Это постоянный источник осложнений и ошибок; вот почему функционал становится таким популярным. И когда бы вы знали, чтобы истечь весь набор результатов в памяти? В Интернете у вас нет возможности узнать, когда пользователь уходит.Ответы:
Начиная с Oracle 12c R1 (12.1), то есть строка ограничение пункт . Он не использует знакомый
LIMIT
синтаксис, но он может сделать работу лучше с большим количеством опций. Вы можете найти полный синтаксис здесь . (Также читайте больше о том, как это работает внутри Oracle в этом ответе ).Чтобы ответить на оригинальный вопрос, вот запрос:
(Для более ранних версий Oracle, пожалуйста, обратитесь к другим ответам в этом вопросе)
Примеры:
Следующие примеры были процитированы со ссылочной страницы в надежде предотвратить гниение ссылок.
Настроить
Что в таблице?
Получить первые
N
строкиПолучить первые
N
строки, еслиN
й строки имеет связи, получить все связанные строкиВерх
x
% строкИспользование смещения, очень полезно для нумерации страниц
Вы можете комбинировать смещение с процентами
источник
OFFSET FETCH
синтаксис является синтаксическим сахаром. ПодробностиВы можете использовать подзапрос для этого как
Посмотрите также тему О ROWNUM и ограничении результатов в Oracle / AskTom для получения дополнительной информации.
Обновление : чтобы ограничить результат нижними и верхними границами, все становится немного более раздутым
(Скопировано из указанной AskTom-статьи)
Обновление 2 : Начиная с Oracle 12c (12.1), доступен синтаксис, ограничивающий строки или начинающийся со смещений.
Смотрите этот ответ для большего количества примеров. Спасибо Крумии за подсказку.
источник
Я провел тестирование производительности для следующих подходов:
Asktom
аналитический
Короткая альтернатива
Результаты
В таблице было 10 миллионов записей, сортировка осуществлялась по неиндексированной строке даты и времени:
Выбор первых 10 строк занял:
Выбор строк от 100 000 до 100 010:
Выбор строк между 9 000 000 и 9 000 010:
источник
BETWEEN
- это просто сокращение для>= AND <=
( stackoverflow.com/questions/4809083/between-clause-versus-and )offset
синтаксис имеет тот же план и производительность, что и аналитический подход.Аналитическое решение только с одним вложенным запросом:
Rank()
может быть заменено,Row_Number()
но может вернуть больше записей, чем вы ожидаете, если для имени есть повторяющиеся значения.источник
rank()
этого также стоит отметить,dense_rank()
что может быть более полезным для управления выводом, так как последний не «пропускает» числа, тогда какrank()
может. В любом случае для этого вопросаrow_number()
лучше всего подходит. Еще один не является этот метод применим к любой БД, которая поддерживает упомянутые функции.В Oracle 12c (см. Предложение по ограничению строк в справочнике по SQL ):
источник
LIMIT
они сошлись со всеми другими поставщиками, чтобы договориться о SQL: 2008, им пришлось взять листок из книги Microsoft и нарушить стандарт.LIMIT ... OFFSET
LIMIT n, m
(см. Мой ответ). Опять же, Oracle должен был быть реализованLIMIT n, m
как синтаксический сахар, как это эквивалентноOFFSET n ROWS FETCH NEXT m ROWS ONLY
.Запросы на нумерацию страниц с упорядочением действительно сложны в Oracle.
Oracle предоставляет псевдостолбец ROWNUM, который возвращает число, указывающее порядок, в котором база данных выбирает строку из таблицы или набора объединенных представлений.
ROWNUM - это псевдоколонка, которая доставляет многим людям неприятности. Значение ROWNUM не всегда назначается строке (это распространенное недоразумение). Это может сбивать с толку, когда значение ROWNUM фактически назначается. Значение ROWNUM присваивается строке после прохождения предикатов фильтра запроса, но до агрегации или сортировки запроса .
Более того, значение ROWNUM увеличивается только после его назначения.
Вот почему следующий запрос не возвращает строк:
Первая строка результата запроса не передает предикат ROWNUM> 1, поэтому ROWNUM не увеличивается до 2. По этой причине никакое значение ROWNUM не будет больше 1, следовательно, запрос не возвращает строк.
Правильно определенный запрос должен выглядеть так:
Узнайте больше о запросах на нумерацию страниц в моих статьях в блоге Vertabelo :
источник
Стандарт SQL
Как я объяснил в этой статье , стандарт SQL: 2008 предоставляет следующий синтаксис для ограничения набора результатов SQL:
Oracle 11g и более ранние версии
До версии 12c для извлечения записей Top-N необходимо было использовать производную таблицу и псевдостолбец ROWNUM:
источник
Менее SELECT заявления. Кроме того, меньше потребляет производительность. Кредиты для: anibal@upf.br
источник
В качестве расширения принятого ответа Oracle внутренне использует
ROW_NUMBER/RANK
функции.OFFSET FETCH
синтаксис является синтаксисом сахара.Это можно наблюдать с помощью
DBMS_UTILITY.EXPAND_SQL_TEXT
процедуры:Подготовка образца:
Запрос:
регулярно:
ДБ <> Fiddle Demo
Извлечение расширенного текста SQL:
WITH TIES
расширяется какRANK
:и смещение:
источник
Если вы не используете Oracle 12C, вы можете использовать запрос TOP N, как показано ниже.
Вы даже можете переместить это из предложения с помощью предложения следующим образом
Здесь на самом деле мы создаем встроенное представление и переименовываем rownum в rnum. Вы можете использовать rnum в основном запросе в качестве критерия фильтрации.
источник
ORDER BY
иrownum
отдельно. По сути, я создал подзапрос сORDER BY
предложением .rownum
должен быть за пределами подзапроса.Я начал готовиться к экзамену Oracle 1z0-047, проверенному на соответствие 12c. При подготовке к нему я столкнулся с расширением 12c, известным как «FETCH FIRST». Оно позволяет вам выбирать строки / ограничивать строки по вашему усмотрению. Несколько вариантов доступны с ним
Пример:
источник
больше, чем значения узнают
меньше, чем значения узнают
источник
ROW_NUMBER()
решение на основе уже было опубликовано Ли Риффель. В зависимости есть синтаксические ошибки в показанном коде.Для каждой строки, возвращаемой запросом, псевдостолбец ROWNUM возвращает число, указывающее порядок, в котором Oracle выбирает строку из таблицы или набора соединенных строк. Первый выбранный ряд имеет ROWNUM, равный 1, второй - 2 и т. Д.
Я реализовал это на
oracle
сервере11.2.0.1.0
источник
В случае SQL-Developer, он автоматически выбирает только первые 50 строк. И если мы прокрутим вниз, он получит еще 50 строк и так далее!
Следовательно, нам не нужно определять, в случае инструмента sql-developer!
источник
В оракуле
VAL
Выбрано 5 строк
SQL>
источник
(не проверено) что-то подобное может сделать работу
Существует также ранг аналитической функции, который вы можете использовать для упорядочения.
источник
То же, что и выше с исправлениями. Работает, но определенно не красиво.
Честно говоря, лучше использовать приведенные выше ответы.
источник