sql - Oracle 12c:ORDER BY 排序工作,除了回退机制
问题描述
我对 Oracle 12c 数据库和数据排序有一点问题。
这是我的桌子:
ID | DATE | INVOICENO | SUBJECT
10000 | 01.08.2019 | NULL | Sub1
10001 | 01.08.2019 | NULL | Sub2
10002 | 03.08.2019 | NULL | Sub3
10003 | 05.08.2019 | NULL | Sub4
[...]
这是我的sql语句:
SELECT DISTINCT FOO_ORDERS.INVOICENO,
FOO_ORDERS.SUBJECT,
FOO_ORDERS.DATE,
FOO_ORDERS.ID
FROM FOO_ORDERS
WHERE FOO_ORDERS.ID >= 10000 AND FOO_ORDERS.ID <= 10500
ORDER BY FOO_ORDERS.INVOICENO
所以我在两个不同的 Oracle 安装中执行这个 sql 语句。
结果服务器1:
ID | DATE | INVOICENO | SUBJECT
10000 | 01.08.2019 | NULL | Sub1
10001 | 01.08.2019 | NULL | Sub2
10002 | 03.08.2019 | NULL | Sub3
10003 | 05.08.2019 | NULL | Sub4
[...]
您会看到 ORDER BY 对 INVOICENO 进行排序(但每一行都是 NULL),然后按 ID ASC 排序。这是正确和需要的结果。
结果服务器2:
ID | DATE | INVOICENO | SUBJECT
10002 | 03.08.2019 | NULL | Sub3
10001 | 01.08.2019 | NULL | Sub2
10003 | 05.08.2019 | NULL | Sub4
10000 | 01.08.2019 | NULL | Sub1
[...]
您会看到 ORDER BY 的排序方式与 server1 不同。这是完全随机的,所以结果是错误的。
我不知道为什么这两个 oracle 数据库的行为不同。
如果 ORDER BY 的第一个也是唯一的列在所有列中具有相同的值(在本例中为 NULL),那么如何对 oracle 进行排序?
我需要你的帮助来“修复”server2。
解决方案
SQL 表表示无序集(从技术上讲,是多集)。除非列指定该顺序,否则没有“默认”顺序。
这在您使用 时会产生影响ORDER BY
,无论是在查询中还是在分析函数中。订货不稳定。这意味着当多行具有相同的键值时,则无法确定排序。
在同一系统上运行同一查询两次时,结果集的顺序可能会发生变化。或者在具有相同数据的不同系统上。
如果你想要一个稳定的排序,当其他键值相同时,在末尾包含一个唯一键order by
作为默认值。在这种情况下,id
似乎是一个合适的列:
order by invoice_id, id
推荐阅读
- python - 求解两个方程时我得到一个空列表
- javascript - NPM 模块安装错误“代码 ELIFECYCLE”“errno 4058”
- r - R中的stringr:当filename和filename.extension共享公共字符时从filename.extension中提取文件名
- beautifulsoup - 出现错误 AttributeError:ResultSet 对象没有属性“find_all”
- reactjs - 光滑的滑块在reactjs中多次渲染幻灯片
- c++ - 普通C++代码导致结果不确定
- python - Networkit 未在 jupyter 笔记本中导入
- ios - 自定义框架 UIView
- r - 将 .XLS 文件读入 R
- database - 在远程服务器上移动 PostgreSQL 数据库的最快方法