首页 > 解决方案 > 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。

标签: sqloraclesortingsql-order-byoracle12c

解决方案


SQL 表表示无序集(从技术上讲,是多集)。除非列指定该顺序,否则没有“默认”顺序。

这在您使用 时会产生影响ORDER BY,无论是在查询中还是在分析函数中。订货不稳定。这意味着当多行具有相同的键值时,则无法确定排序。

在同一系统上运行同一查询两次时,结果集的顺序可能会发生变化。或者在具有相同数据的不同系统上。

如果你想要一个稳定的排序,当其他键值相同时,在末尾包含一个唯一键order by作为默认值。在这种情况下,id似乎是一个合适的列:

order by invoice_id, id

推荐阅读