首页 > 解决方案 > 将 FETCH NEXT X ROWS ONLY 与 ORDER BY 结合使用时,Oracle 未返回预期结果

问题描述

在使用 Oracle 12c 并实现分页时,我在与和ORDER BY结合使用时遇到了一个问题。OFFSETFETCH 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使用它时,它可以完美地工作。是否禁止此类使用?我用错了吗?如果是这样,您能否将我指向文档,其中说这种用法是不可能的。我使用的版本是 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 |
+----+

谢谢

亚当

标签: sqloraclesql-order-byoracle12coracle19c

解决方案


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

根据您的预期结果,我了解到您需要第二个订购标准id

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

推荐阅读