sql - 将 FETCH NEXT X ROWS ONLY 与 ORDER BY 结合使用时,Oracle 未返回预期结果
问题描述
在使用 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 |
+--------+--------+-----------------+
问题
问题是为什么数据库没有返回预期的结果?
当没有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;
推荐阅读
- python-3.x - 如何使用 python selenium 从页面中递归地刮取表格
- linux-kernel - ACPI 定义块:系统总线的 _SB 和 _SB_ 之间的区别
- html - 转换 translateY 在 Safari 上不起作用
- c++ - 使用 cmake 静态链接到 Linux 中的 C++ AWS 开发工具包会因链接到共享对象文件而失败
- django - 在 Django 模型字段中存储层次结构/树?
- javascript - 如何在使用 JavaScript 或 jQuery 选择父选项时进行选择
- angular - Angular 6 - 使用范围外的函数和回调函数
- python - 对象没有属性 JSON
- javascript - 生成的 html 脚本中的 JS 函数不会运行内容
- c++ - 为什么 [[nodiscard]] 只鼓励编译器发出警告而不要求它?