Oracle 默认行为排序

Posted

技术标签:

【中文标题】Oracle 默认行为排序【英文标题】:Oracle default order by behavior 【发布时间】:2019-11-01 10:05:32 【问题描述】:

在选择查询中,当我们在某些列上添加 order by 并且在返回的结果集中,该列包含某些行的相同值,这些行的排序行为是什么?

【问题讨论】:

可能未定义,您可以自己在ORDER BY 子句中添加另一列。 ORDER BY 未定义的行顺序是任意的/未定义的。 【参考方案1】:

没有定义排序行为,一般来说,至少 ANSI 标准不要求数据库供应商提供。您可能会发现某个顺序往往会被遵守,但最好的办法是只使用第二个排序级别来打破平局,即使用:

SELECT *
FROM yourTable
ORDER BY
    col1,
    col2;    -- break the tie

如果你的数据是:

col1 | col2
1    | 1
1    | 2
2    | 4
2    | 1

那么上面的查询将返回一个你期望的排序结果。

【讨论】:

"没有定义的排序行为,一般"我认为没有任何供应商有当ORDER BY 丢失或不唯一时定义排序行为,因为排序会消耗性能,并且他们都不想减慢查询速度以呈现客户端不关心的排序。 @Andreas 。 . .实际上有种情况。 mysql 已经保证了group by 查询中的排序,尽管该行为已被弃用。不太传统的数据库产品,例如 MS Access,在某些情况下也可以保证排序,但我怀疑这是否真的有文档记录。 “我怀疑这实际上是记录在案的” 如果没有记录,那么它是“未定义”。仅仅因为某个实现可能是当前可预测的,并不能使其“定义”,因为一个实现可能会在没有通知的情况下更改。如果没有记录,“保证”从何而来? 即使对于 MySQL,对于带有 GROUP BY 的语句的(已弃用)默认排序,文档说要添加 ORDER BY NULL 以防止这种行为,因此任何 ORDER BY 都会消除该默认排序,因此,当问题问 “当我们在某个列上添加 order by 时” 时,这意味着 MySQL 在 ORDER BY 中列出的列之外没有定义的排序,即使 @987654329 @ 列出更多列。

以上是关于Oracle 默认行为排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django ORM 中更改 PostgreSQL 的默认空排序行为

oracle 默认是升序还是降序

添加具有空字符串作为默认值且非空约束的列会导致 oracle 数据库的行为不一致

关于 Oracle PL/SQL 引号运算符中的换行符:可以更改默认行为吗?

如何提高在Lucene搜索结果中的默认排序?

ORACLE中创建如何创建表,并设置结构和默认值