Я не так хорошо знаком с Oracle, каким хотел бы быть. У меня есть записи 250 тыс., И я хочу отображать их по 100 на страницу. В настоящее время у меня есть одна хранимая процедура, которая извлекает все четверть миллиона записей в набор данных с использованием адаптера данных и набора данных, а также метод dataadapter.Fill(набор данных) по результатам хранимой процедуры. Если у меня есть "Номер страницы" и "Количество записей на странице" в качестве значений целого числа, которые я могу передать в качестве параметров, что было бы лучшим способом вернуть именно этот конкретный раздел. Скажем, если я передам 10 в качестве номера страницы, а 120 - как количество страниц, из предложения select это даст мне 1880-е по 1200-й, или что-то в этом роде, моя математика в моей голове может быть выключена.
Я делаю это в .NET с С#, считал, что это не важно, если я могу правильно это сделать на стороне SQL, тогда мне должно быть здорово.
Обновление: я смог использовать предложение Брайана, и он отлично работает. Я хотел бы поработать над некоторой оптимизацией, но страницы появляются в течение 4-5 секунд, а не через минуту, и мой пейджинговый контроль смог очень хорошо интегрироваться с моими новыми хранимыми процедурами.
Ответ 1
Что-то вроде этого должно работать: Из журнала Frans Bouma
SELECT * FROM
(
SELECT a.*, rownum r__
FROM
(
SELECT * FROM ORDERS WHERE CustomerID LIKE 'A%'
ORDER BY OrderDate DESC, ShippingDate DESC
) a
WHERE rownum < ((pageNumber * pageSize) + 1 )
)
WHERE r__ >= (((pageNumber-1) * pageSize) + 1)
Ответ 2
Спросите у Тома о разделении страниц и очень, очень полезных аналитических функциях.
Это выдержка из этой страницы:
select * from (
select /*+ first_rows(25) */
object_id,object_name,
row_number() over
(order by object_id) rn
from all_objects)
where rn between :n and :m
order by rn;
Ответ 3
В интересах полноты, для людей, которые ищут более современное решение, в Oracle 12c есть несколько новых функций, включая улучшенную подкачку и верхнюю обработку.
Paging
Пейджинг выглядит следующим образом:
SELECT *
FROM user
ORDER BY first_name
OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY;
Лучшие записи N
Получение верхних записей выглядит следующим образом:
SELECT *
FROM user
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY
Обратите внимание на то, что оба приведенных выше примера запроса имеют предложения ORDER BY
. Новые команды уважают их и запускаются на отсортированные данные.
Я не мог найти хорошую страницу ссылок Oracle для FETCH
или OFFSET
, но эта страница имеет большой обзор этих новых функций.
Ответ 4
Просто хочу обобщить ответы и комментарии. Существует несколько способов сделать разбивку на страницы.
До оракула 12c не было функциональности OFFSET/FETCH, поэтому посмотрите на технический документ, как предлагал @jasonk. Это самая полная статья, которую я нашел о различных методах с подробным объяснением преимуществ и недостатков. Это займет много времени, чтобы скопировать их здесь, поэтому я не буду этого делать.
Существует также хорошая статья от создателей jooq, объясняющих некоторые общие оговорки с разбиением на оракулы и другие базы данных. jooq blogpost
Хорошие новости, так как оракул 12c имеет новую функциональность OFFSET/FETCH. Новые возможности OracleMagazine 12c. См. "Самые популярные запросы и разбивка на страницы"
Вы можете проверить версию oracle, выпустив следующую инструкцию
SELECT * FROM V$VERSION
Ответ 5
Попробуйте следующее:
SELECT *
FROM
(SELECT FIELDA,
FIELDB,
FIELDC,
ROW_NUMBER() OVER (ORDER BY FIELDC) R
FROM TABLE_NAME
WHERE FIELDA = 10
)
WHERE R >= 10
AND R <= 15;
через [tecnicume]