将 FETCH NEXT X ROWS ONLY 与 ORDER BY 结合使用时,Oracle 未返回预期结果

Oracle not returning expected results when using FETCH NEXT X ROWS ONLY in combination with ORDER BY

在使用 Oracle 12c 和实现分页时,我在将 ORDER BYOFFSETFETCH NEXT <X> ROWS ONLY 结合使用时遇到了问题。

例子

我的测试tabletest:

+----+---------------------+
| 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 时,它可以完美运行。这种使用是否被禁止?我用错了吗?如果是这样,请指点我说无法使用这种用法的文档。我使用的版本是 12c,但同样的行为适用于 19c。

更多示例查询

仅使用 OFFSET 查询:

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

结果:

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

查询 OFFSETFETCH NEXT 1 ROWS ONLY:

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

结果:

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

谢谢

亚当

您的 ORDER BY 子句产生联系,因为多个记录具有相同的 name。在这种情况下,未定义将选择哪条记录。

根据您的预期结果,我了解到您需要 id:

的第二个订购标准
SELECT id
FROM test
ORDER BY name, id
OFFSET <offset> ROWS
FETCH NEXT 1 ROWS ONLY;