Альтернативы LIMIT и OFFSET для подкачки в Oracle - PullRequest
42 голосов
/ 26 мая 2010

Я занимаюсь разработкой веб-приложения и мне нужно упорядочить результаты. Я обычно использую LIMIT / OFFSET для этой цели.

Каков наилучший способ упорядочить результаты в Oracle? Я видел несколько примеров с использованием rownum и подзапросов. Это способ? Не могли бы вы дать мне пример для перевода этого SQL в Oracle:

SELECT fieldA,fieldB 
FROM table 
ORDER BY fieldA 
OFFSET 5 LIMIT 14

(я использую Oracle 10g, для чего это стоит)

Спасибо!


Ответ: Используя ссылку, предоставленную karim79 ниже, этот SQL будет выглядеть так:

SELECT * FROM (
    SELECT rownum rnum, a.* 
    FROM(
        SELECT fieldA,fieldB 
        FROM table 
        ORDER BY fieldA 
    ) a 
    WHERE rownum <=5+14
)
WHERE rnum >=5

Ответы [ 4 ]

20 голосов
/ 07 марта 2011

Поскольку вы используете 10g, вы сможете упростить подход ROWNUM, используя аналитические функции

SELECT fieldA, 
       fieldB
  FROM (SELECT fieldA,
               fieldB,
               row_number() over (order by fieldA) rnk
          FROM table_name)
 WHERE rnk BETWEEN 5 AND 14;
19 голосов
/ 01 сентября 2014

Начиная с оракула 12c, вы можете использовать верхние N запросов.

SELECT fieldA,fieldB 
FROM table 
ORDER BY fieldA 
OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY;

* ** +1004 1005 * -base.com / изделия / 12с / строка ограничивающими-пункт-для-топ-N-запросы-12cr1.php

15 голосов
/ 26 мая 2010

Вам нужно будет использовать псевдостолбец rownum для ограничения результатов. Смотрите здесь:

http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html

http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

1 голос
/ 23 апреля 2019

Способ-1: Для базы данных версии Oracle12c или выше

SELECT fieldA, fieldB 
FROM table 
ORDER BY fieldA 
OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY

Метод 2: для версии базы данных Oracle11g или ниже с использованием аналитической функции RowNumber ()

SELECT fieldA, fieldB
FROM (
    SELECT fieldA, fieldB,
        row_number() over (order by fieldA) rowRank
    FROM table_name
)
WHERE rowRank BETWEEN 5 AND 14;

Метод 3: для версии базы данных Oracle11g или ниже с использованием RowNum

SELECT T.* FROM ( 
SELECT T.*, rowNum as rowIndex
FROM (
    SELECT fieldA, fieldB,
    FROM table_name
)T)T
WHERE rowIndex > 0 AND rowIndex <= 20;

В некоторых случаях я обнаружил, что метод-3 быстрее, чем метод-2, поскольку в методе 2 обязательный порядок по пунктам. Однако, если у вас версия базы данных 12c или выше, вы должны использовать метод-1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...