0

在使用 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 |
+----+

谢谢

亚当

4

1 回答 1

3

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

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

SELECT id
FROM test
ORDER BY name, id
OFFSET <offset> ROWS
FETCH NEXT 1 ROWS ONLY;
于 2020-01-22T17:15:16.167 回答