Oracle не возвращает ожидаемых результатов при использовании только FETCH NEXT X ROWS в сочетании с ORDER BY - PullRequest
0 голосов
/ 22 января 2020

При работе с Oracle 12 c и реализации нумерации страниц я столкнулся с проблемой при использовании ORDER BY в сочетании с OFFSET и FETCH NEXT <X> ROWS ONLY.

Пример

Моя таблица тестирования test:

+----+---------------------+
| ID |        NAME         |
+----+---------------------+
|  1 | Customer Support    |
|  2 | Property Management |
|  3 | Security            |
|  4 | Security            |
|  5 | Security            |
|  6 | Security            |
|  7 | Tax Compliance      |
+----+---------------------+

Я выполняю следующие действия: SQL:

SELECT  id
FROM            test
ORDER BY        name ASC   
OFFSET <offset> ROWS   
FETCH NEXT 1 ROWS ONLY;

С этими результатами:

+--------+--------+-----------------+
| Offset | Result | Expected result |
+--------+--------+-----------------+
|      0 |      1 |               1 |
|      1 |      2 |               2 |
|      2 |      3 |               3 |
|      3 |      4 |               4 |
|      4 |      4 |               5 |
|      5 |      4 |               6 |
|      6 |      7 |               7 |
+--------+--------+-----------------+

Вопрос

Вопрос в том, почему БД не возвращает ожидаемый результат?

Когда не используется ORDER BY, он работает безупречно. Этот вид использования запрещен? Я использую это неправильно? Если да, то не могли бы вы указать мне документацию, в которой говорится, что такого рода использование невозможно. Я использую версию 12 c, но то же самое относится и к 19 c.

Дополнительные примеры запросов

Запрос только с OFFSET:

SELECT  id
FROM            test
ORDER BY        name ASC   
OFFSET 4 ROWS;

Результат:

+----+
| ID |
+----+
|  5 |
|  6 |
|  7 |
+----+

Запрос с OFFSET и FETCH NEXT 1 ROWS ONLY:

SELECT  id
FROM            test
ORDER BY        name ASC   
OFFSET 4 ROWS
FETCH NEXT 1 ROWS ONLY;

Результат:

+----+
| ID |
+----+
|  4 |
+----+

Спасибо

Адам

1 Ответ

3 голосов
/ 22 января 2020

Ваше предложение ORDER BY создает связи, так как несколько записей имеют одинаковые name. В этом случае не определено, какая запись будет выбрана.

Из ваших ожидаемых результатов я понимаю, что вы хотите второй критерий заказа на id:

SELECT id
FROM test
ORDER BY name, id
OFFSET <offset> ROWS
FETCH NEXT 1 ROWS ONLY;
...