FETCH в PL/SQL. Введение
Если любишь эффективные выборки так же, как я, то «ограничение строк» — твой лучший друг. В Oracle это делает FETCH — современная row limiting clause, которая даёт элегантную пагинацию без громоздких костылей. Поговорим по‑простому, зачем это нужно и как применять, чтобы запросы летали.
Синтаксис
SELECT cols
FROM t
[WHERE ...]
[ORDER BY ...]
[OFFSET n ROWS]
FETCH {FIRST|NEXT} n {ROW|ROWS} {ONLY|WITH TIES}Ключевые идеи: сортируй в ORDER BY, затем укажи смещение через OFFSET и «сколько взять». WITH TIES расширяет результат до всех записей с тем же значением сортировки на границе.
Где используют
- Пагинация: списки товаров, журнал событий, выдача отчётов.
- Топ‑N и Top‑PERCENT: рейтинги, бенчмарки, ABC‑анализ.
- Подзапросы: выбирать «лучших» в каждой группе вместе с ORDER BY и оконными функциями.
- Стабильные витрины: фиксировать размер выборки для кэшей и выдачи API.
100 примеров
1. Топ 10 чеков по сумме
SELECT check_id,total
FROM checks
ORDER BY total DESC
FETCH FIRST 10 ROWS ONLY2. Первые 5 без сортировки
SELECT *
FROM products
FETCH FIRST 5 ROWS ONLY3. Пагинация страница 2 по 20 записей
SELECT order_id,amount
FROM orders
ORDER BY order_date DESC
OFFSET 20 ROWS
FETCH NEXT 20 ROWS ONLY4. Все связки на границе значений
SELECT emp_id,salary
FROM employees
ORDER BY salary DESC
FETCH FIRST 1 ROW WITH TIES5. Топ 5 процентов продаж
SELECT order_id,amount
FROM orders
ORDER BY amount DESC
FETCH FIRST 5 PERCENT ROWS ONLY6. Выборка для превью каталога
SELECT sku,name,price
FROM items
ORDER BY created_at DESC
FETCH NEXT 12 ROWS ONLY7. Смещение и ограничение вместе
SELECT id,created_at
FROM events
ORDER BY created_at DESC
OFFSET 100 ROWS
FETCH NEXT 50 ROWS ONLY8. Один элемент лидборда
SELECT user_id,score
FROM leaderboard
ORDER BY score DESC
FETCH FIRST 1 ROW ONLY9. Стабильный список с дедупликацией
SELECT DISTINCT city
FROM customers
ORDER BY city
FETCH FIRST 100 ROWS ONLY10. Топ транзакций по дате и сумме
SELECT trx_id,amount,trx_date
FROM trx
ORDER BY trx_date DESC,amount DESC
FETCH FIRST 30 ROWS ONLY11. Самые новые публикации
SELECT post_id,title
FROM posts
ORDER BY published_at DESC
FETCH FIRST 8 ROWS ONLY12. Каталог по цене с пропуском первых
SELECT sku,name,price
FROM items
ORDER BY price
OFFSET 40 ROWS
FETCH NEXT 20 ROWS ONLY13. Лента активности для виджета
SELECT user_id,action,created_at
FROM activity
ORDER BY created_at DESC
FETCH FIRST 15 ROWS ONLY14. Отчёт по самым дорогим заказам
SELECT order_id,customer_id,amount
FROM orders
ORDER BY amount DESC
FETCH FIRST 25 ROWS ONLY15. Постраничный просмотр логов
SELECT id,ts,level,msg
FROM app_log
ORDER BY ts DESC
OFFSET 200 ROWS
FETCH NEXT 100 ROWS ONLY16. Списки без повторов с ограничением
SELECT DISTINCT category
FROM products
ORDER BY category
FETCH FIRST 50 ROWS ONLY17. Подборка лидов по вероятности
SELECT lead_id,probability
FROM leads
ORDER BY probability DESC
FETCH FIRST 20 ROWS ONLY18. Быстрый эскиз данных
SELECT *
FROM sample_data
FETCH FIRST 3 ROWS ONLY19. Последние изменения профилей
SELECT user_id,updated_at
FROM profiles
ORDER BY updated_at DESC
FETCH NEXT 10 ROWS ONLY20. Отбор по рейтингу с догоном равных
SELECT film_id,rating
FROM films
ORDER BY rating DESC
FETCH FIRST 5 ROWS WITH TIESЕще 20 примеров
21. Постранично с устойчивой сортировкой
SELECT id,created_at
FROM issues
ORDER BY created_at DESC,id DESC
OFFSET 50 ROWS
FETCH NEXT 50 ROWS ONLY22. Ограничение после объединения
SELECT p.product_id,p.name,SUM(oi.qty) AS qty
FROM products p
LEFT JOIN order_items oi ON oi.product_id=p.product_id
GROUP BY p.product_id,p.name
ORDER BY qty DESC
FETCH FIRST 100 ROWS ONLY23. Только первые строки для валидации
SELECT *
FROM import_queue
ORDER BY id
FETCH FIRST 100 ROWS ONLY24. Подразделение лучших по отделам
SELECT dept_id,emp_id,salary
FROM(
SELECT dept_id,emp_id,salary,ROW_NUMBER() OVER(PARTITION BY dept_id ORDER BY salary DESC) rn
FROM employees
) x
WHERE rn<=325. Минимальные задержки
SELECT host,latency_ms
FROM ping_stats
ORDER BY latency_ms
FETCH FIRST 20 ROWS ONLY26. Топ новых клиентов за месяц
SELECT customer_id,created_at
FROM customers
WHERE created_at>=ADD_MONTHS(TRUNC(SYSDATE,'MM'),0)
ORDER BY created_at DESC
FETCH FIRST 50 ROWS ONLY27. Выдержка из длинного списка
SELECT id,title
FROM articles
ORDER BY popularity DESC
OFFSET 500 ROWS
FETCH NEXT 50 ROWS ONLY28. Десять самых продаваемых SKU
SELECT sku,SUM(qty) AS sold
FROM order_items
GROUP BY sku
ORDER BY sold DESC
FETCH FIRST 10 ROWS ONLY29. Процентильные лидеры
SELECT user_id,score
FROM scores
ORDER BY score DESC
FETCH FIRST 1 PERCENT ROWS ONLY30. Просмотр очереди задач
SELECT task_id,priority,created_at
FROM tasks
ORDER BY priority DESC,created_at
FETCH NEXT 25 ROWS ONLY31. Сводка отказов по убыванию
SELECT code,COUNT(*) AS cnt
FROM errors
GROUP BY code
ORDER BY cnt DESC
FETCH FIRST 15 ROWS ONLY32. Таблица лидеров с догоном на границе
SELECT player,pts
FROM game_points
ORDER BY pts DESC
FETCH FIRST 10 ROWS WITH TIES33. Анонсы ближайших событий
SELECT event_id,title,start_at
FROM events
WHERE start_at>=SYSDATE
ORDER BY start_at
FETCH FIRST 12 ROWS ONLY34. Отчет по долгам клиентов
SELECT customer_id,SUM(amount) AS debt
FROM invoices
WHERE paid='N'
GROUP BY customer_id
ORDER BY debt DESC
FETCH FIRST 50 ROWS ONLY35. Стабильные результаты с вторичной сортировкой
SELECT id,score,created_at
FROM ratings
ORDER BY score DESC,created_at DESC
FETCH FIRST 30 ROWS ONLY36. Выдержка для dashboard
SELECT metric,value,ts
FROM metrics
ORDER BY ts DESC
FETCH FIRST 60 ROWS ONLY37. Пагинация без пропусков при изменениях
SELECT id,created_at
FROM messages
WHERE created_at<=:cursor_dt
ORDER BY created_at DESC,id DESC
FETCH NEXT 50 ROWS ONLY38. Актуальные прайсы
SELECT product_id,price,price_date
FROM prices
WHERE price_date=TRUNC(SYSDATE)
ORDER BY price DESC
FETCH FIRST 100 ROWS ONLY39. Последние входы пользователей
SELECT user_id,login_at
FROM logins
ORDER BY login_at DESC
FETCH NEXT 40 ROWS ONLY40. Горячие статьи за неделю
SELECT post_id,views
FROM post_views
WHERE view_date>=TRUNC(SYSDATE)-7
ORDER BY views DESC
FETCH FIRST 20 ROWS ONLYЕще 20 примеров
41. Список по алфавиту с лимитом
SELECT supplier_name
FROM suppliers
ORDER BY supplier_name
FETCH FIRST 80 ROWS ONLY42. Первые id для отладки
SELECT id
FROM t_debug
ORDER BY id
FETCH FIRST 10 ROWS ONLY43. Отбор с OFFSET для скролла
SELECT id,title
FROM news
ORDER BY published_at DESC
OFFSET 100 ROWS
FETCH NEXT 25 ROWS ONLY44. Популярные теги
SELECT tag,COUNT(*) AS cnt
FROM post_tags
GROUP BY tag
ORDER BY cnt DESC
FETCH FIRST 30 ROWS ONLY45. Слабые места производительности
SELECT endpoint,avg_ms
FROM perf_avg
ORDER BY avg_ms DESC
FETCH FIRST 50 ROWS ONLY46. Лидеры продаж по категориям
SELECT category,SUM(qty) AS sold
FROM sales
GROUP BY category
ORDER BY sold DESC
FETCH FIRST 12 ROWS ONLY47. Часто покупаемые пары
SELECT a.sku AS sku1,b.sku AS sku2,COUNT(*) AS cnt
FROM basket_pairs a
JOIN basket_pairs b ON b.pair_id=a.pair_id AND b.pos=2
WHERE a.pos=1
GROUP BY a.sku,b.sku
ORDER BY cnt DESC
FETCH FIRST 25 ROWS ONLY48. Лучшие маршруты доставки
SELECT route,avg_time_min
FROM delivery_routes
ORDER BY avg_time_min
FETCH FIRST 10 ROWS ONLY49. Каналы с высоким вовлечением
SELECT channel,avg_engagement
FROM channels_stat
ORDER BY avg_engagement DESC
FETCH FIRST 10 ROWS ONLY50. Спецификации с последней ревизией
SELECT spec_id,rev,author
FROM(
SELECT spec_id,rev,author,ROW_NUMBER() OVER(PARTITION BY spec_id ORDER BY rev DESC) rn
FROM specs
) x
WHERE rn=1
ORDER BY rev DESC
FETCH FIRST 50 ROWS ONLY51. Самые обсуждаемые темы
SELECT topic,COUNT(*) AS posts
FROM forum_posts
GROUP BY topic
ORDER BY posts DESC
FETCH FIRST 20 ROWS ONLY52. Новые клиенты региона
SELECT customer_id,created_at
FROM customers
WHERE region=:r
ORDER BY created_at DESC
FETCH NEXT 30 ROWS ONLY53. Недорогие позиции для витрины
SELECT sku,name,price
FROM items
WHERE price<=100
ORDER BY price
FETCH FIRST 40 ROWS ONLY54. Смещение выборки для бесконечного скролла
SELECT id,ts
FROM timeline
ORDER BY ts DESC
OFFSET :offset ROWS
FETCH NEXT :limit ROWS ONLY55. Кампании с максимальным ROI
SELECT campaign,roi
FROM marketing_roi
ORDER BY roi DESC
FETCH FIRST 10 ROWS ONLY56. Лидеры по конверсии
SELECT segment,conversion
FROM segments
ORDER BY conversion DESC
FETCH FIRST 15 ROWS ONLY57. Быстрый чек качества данных
SELECT table_name,issues
FROM dq_issues
ORDER BY issues DESC
FETCH FIRST 100 ROWS ONLY58. Популярные запросы в поиске
SELECT query,COUNT(*) AS cnt
FROM search_log
GROUP BY query
ORDER BY cnt DESC
FETCH FIRST 50 ROWS ONLY59. Регионы с минимальным чеком
SELECT region,AVG(amount) AS avg_check
FROM orders
GROUP BY region
ORDER BY avg_check
FETCH FIRST 10 ROWS ONLY60. Маршруты с наименьшими отменами
SELECT route,cancel_rate
FROM route_stats
ORDER BY cancel_rate
FETCH FIRST 15 ROWS ONLYЕще 20 примеров
61. Свежие тикеты поддержки
SELECT ticket_id,created_at,priority
FROM tickets
ORDER BY created_at DESC
FETCH FIRST 25 ROWS ONLY62. Сообщения лидов с высоким скорингом
SELECT lead_id,score,updated_at
FROM leads
ORDER BY score DESC,updated_at DESC
FETCH NEXT 20 ROWS ONLY63. Снимок среза метрик
SELECT metric,value
FROM metrics_agg
ORDER BY metric
FETCH FIRST 100 ROWS ONLY64. Топ отраслей по выручке
SELECT industry,SUM(revenue) AS rev
FROM company_fin
GROUP BY industry
ORDER BY rev DESC
FETCH FIRST 10 ROWS ONLY65. Клиенты с частыми покупками
SELECT customer_id,COUNT(*) AS cnt
FROM orders
GROUP BY customer_id
ORDER BY cnt DESC
FETCH FIRST 30 ROWS ONLY66. Аккаунты с максимальным LTV
SELECT account_id,ltv
FROM ltv
ORDER BY ltv DESC
FETCH FIRST 20 ROWS ONLY67. Сотрудники с высшей оценкой
SELECT emp_id,rating
FROM perf
ORDER BY rating DESC
FETCH FIRST 15 ROWS WITH TIES68. Список для автодополнения
SELECT city
FROM cities
WHERE city LIKE :q||'%'
ORDER BY city
FETCH FIRST 10 ROWS ONLY69. Кандидаты по последней активности
SELECT candidate_id,last_active
FROM candidates
ORDER BY last_active DESC
FETCH FIRST 50 ROWS ONLY70. Ядро активной аудитории
SELECT user_id,last_seen
FROM users
WHERE last_seen>=SYSDATE-7
ORDER BY last_seen DESC
FETCH FIRST 100 ROWS ONLY71. Ранжирование и ограничение
SELECT user_id,score
FROM(
SELECT user_id,score,ROW_NUMBER() OVER(ORDER BY score DESC) rn
FROM scores
) x
WHERE rn<=10072. Товары для email‑витрины
SELECT sku,name,price
FROM items
WHERE stock>0
ORDER BY updated_at DESC
FETCH NEXT 6 ROWS ONLY73. Первые строки для профайлинга
SELECT *
FROM big_table
FETCH FIRST 2 ROWS ONLY74. Предел в расчётах KPI
SELECT kpi,value
FROM kpi_values
ORDER BY calc_time DESC
FETCH FIRST 200 ROWS ONLY75. Фильмы с наивысшей оценкой
SELECT title,rating
FROM movies
ORDER BY rating DESC
FETCH FIRST 50 ROWS WITH TIES76. Города по населению
SELECT city,population
FROM city_pop
ORDER BY population DESC
FETCH FIRST 20 ROWS ONLY77. Быстрый отчёт по складу
SELECT sku,qty
FROM stock
ORDER BY qty DESC
FETCH FIRST 100 ROWS ONLY78. Отбор на витрину баннеров
SELECT banner_id,priority
FROM banners
ORDER BY priority DESC
FETCH NEXT 5 ROWS ONLY79. Самые свежие отзывы
SELECT review_id,created_at,rating
FROM reviews
ORDER BY created_at DESC
FETCH FIRST 30 ROWS ONLY80. Дешёвые предложения
SELECT offer_id,price
FROM offers
ORDER BY price
FETCH FIRST 20 ROWS ONLYЕще 20 примеров
81. Постраничный список заказов
SELECT order_id,order_date,amount
FROM orders
ORDER BY order_date DESC,order_id DESC
OFFSET :off ROWS
FETCH NEXT :lim ROWS ONLY82. Топ сотрудников по продажам
SELECT emp_id,SUM(amount) AS total
FROM sales
GROUP BY emp_id
ORDER BY total DESC
FETCH FIRST 15 ROWS ONLY83. Участники марафона по времени
SELECT runner,time_sec
FROM marathon
ORDER BY time_sec
FETCH FIRST 50 ROWS ONLY84. Новые репозитории
SELECT repo,created_at
FROM repos
ORDER BY created_at DESC
FETCH FIRST 25 ROWS ONLY85. Клиенты с наибольшим средним чеком
SELECT customer_id,AVG(amount) AS avg_amt
FROM orders
GROUP BY customer_id
ORDER BY avg_amt DESC
FETCH FIRST 20 ROWS ONLY86. Первые по алфавиту
SELECT last_name,first_name
FROM people
ORDER BY last_name,first_name
FETCH FIRST 40 ROWS ONLY87. Регионы с высокими налогами
SELECT region,tax_rate
FROM taxes
ORDER BY tax_rate DESC
FETCH FIRST 10 ROWS ONLY88. Товары с минимальной ценой
SELECT sku,price
FROM items
ORDER BY price
FETCH FIRST 10 ROWS ONLY89. Пики нагрузки по часам
SELECT hour,reqs
FROM traffic_by_hour
ORDER BY reqs DESC
FETCH FIRST 24 ROWS ONLY90. Погрешности измерений сверху
SELECT sensor_id,err
FROM sensor_err
ORDER BY err DESC
FETCH FIRST 100 ROWS ONLY91. Запросы с максимальным временем
SELECT sql_id,elapsed_ms
FROM sql_stat
ORDER BY elapsed_ms DESC
FETCH FIRST 20 ROWS ONLY92. Популярные маршруты
SELECT route,COUNT(*) AS cnt
FROM trips
GROUP BY route
ORDER BY cnt DESC
FETCH FIRST 15 ROWS ONLY93. Продукты для акции
SELECT sku,discount
FROM discounts
ORDER BY discount DESC
FETCH FIRST 30 ROWS ONLY94. Сервера с минимальным аптаймом
SELECT host,uptime_days
FROM uptime
ORDER BY uptime_days
FETCH FIRST 10 ROWS ONLY95. Лучшие товарищи по ассистам
SELECT player,assists
FROM stats
ORDER BY assists DESC
FETCH FIRST 20 ROWS ONLY96. Сотрудники с наибольшим опытом
SELECT emp_id,years
FROM experience
ORDER BY years DESC
FETCH FIRST 25 ROWS ONLY97. Заявки в обработке
SELECT app_id,priority
FROM applications
WHERE status='IN_PROGRESS'
ORDER BY priority DESC
FETCH FIRST 50 ROWS ONLY98. Контракты по сумме
SELECT contract_id,amount
FROM contracts
ORDER BY amount DESC
FETCH FIRST 30 ROWS ONLY99. Самые короткие задачи
SELECT task_id,estimate_h
FROM backlog
ORDER BY estimate_h
FETCH FIRST 20 ROWS ONLY100. Финальный срез для дашборда
SELECT metric,value
FROM kpi_now
ORDER BY metric
FETCH FIRST 100 ROWS ONLYДокументация
Oracle SQL Language Reference — Row Limiting (OFFSET … FETCH)
🔜 Следующая статья:
FALSE в Oracle SQL — как интерпретируются ложные условия и где он применяется