Oracle 12c を使用してページネーションを実装しているときに、と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 |
+--------+--------+-----------------+
質問
問題は、DB が期待される結果を返さないのはなぜですか?
noORDER BY
を使用すると、問題なく動作します。このような使用は禁止されていますか?私はそれを間違って使用していますか?もしそうなら、この種の使用は不可能であると書かれているドキュメントを教えてください。私が使用しているバージョンは 12c ですが、同じ動作が 19c にも当てはまります。
その他のクエリ例
クエリ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 |
+----+
ありがとうございました
アダム