将 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 BY
与 OFFSET
和 FETCH 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 |
+----+
查询 OFFSET
和 FETCH 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;
在使用 Oracle 12c 和实现分页时,我在将 ORDER BY
与 OFFSET
和 FETCH 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 |
+----+
查询 OFFSET
和 FETCH 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;