Автор Тема: Аналог limit в Oracle  (Прочитано 29228 раз)

Марахтанов Алексей

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 205
    • marahtanov.ru
Аналог limit в Oracle
« : 25 Февраль 2011, 23:59:36 »
Язык SQL базы данных Oracle не поддерживает инструкцию limit, знакомую нам по СУБД MySQL и используемую для ограничения диапазона выдаваемых строк.

Однако требуемый функционал можно получить следующим образом (рекомендация знаменитого Тома Кайта, подробнее тут: http://www.oracle.com/global/ru/oramag/mayjune2007/w_dev_asktom56.html):

select * from (select a.*, rownum rnum from (SQL) a where rownum <= MAX_ROW) where rnum >= MIN_ROW
где
SQL - реальный запрос,
MIN_ROW - порядковый номер записи, с которой необходимо начать вывод,
MAX_ROW - порядковый номер запроса, которым нужно закончить вывод.

Например, запрос

select * from (select a.*, rownum rnum from (select ID, TITLE from news order by DT desc) a where rownum <= 29) where rnum >= 20
вернет только новости с 20-й по 29-ю из общего списка новостей, отсортированных по убыванию даты (столбец DT).

Потребность в выполнении подобных запросов может возникнуть, например, при реализации постраничной разбивки.

Для удобства осуществления в проектах запросов с ограничениями возвращаемой выборки удобно использовать функцию, которая автоматически формирует нужный запрос. Например, такую (код на языке php):

function get_limit_sql ($sql, $min_row, $max_row)
{
return "select * from (select a.*, rownum rnum from ($sql) a where rownum <= $max_row) where rnum >= $min_row";
}

и вызывать ее всякий раз перед выполнением запроса следующим образом:

$sql = get_limit_sql ("select ID, TITLE from news order by DT desc", 20, 29);
PS.
То же самое в MySQL можно сделать запросом
select ID, TITLE from news order by DT desc limit 20,10 (начиная с 20-й 10 записей)
« Последнее редактирование: 26 Февраль 2011, 00:39:00 от Марахтанов Алексей »