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 数据库的行为不一致