SQL order by 子句是否保证稳定(按标准)

问题描述 投票:0回答:2

我正在使用以下查询来查询在两列上有 order by 的数据库。

从 Table1 中选择 a,b,c 按 a asc, b asc;

我的问题是,排序是否保证稳定(按标准)。虽然它不稳定没有任何意义,但我问这个是因为我在网上读到了

该标准并不妨碍稳定排序的使用,但它也 不需要它。

sql database sql-order-by
2个回答
14
投票

不保证排序稳定。我认为 SQL Server 文档 对如何实现稳定排序有很好的解释:

使用OFFSET和OFFSET在查询请求之间获得稳定的结果 FETCH,必须满足以下条件: 查询使用的基础数据不得更改。也就是说,要么行接触 查询未更新或所有对页面的请求均来自查询 使用快照或在单个事务中执行 可序列化事务隔离。有关这些的更多信息 事务隔离级别,请参阅设置事务隔离级别 (事务 SQL)。 ORDER BY 子句包含列或组合 保证唯一的列。

了解排序“不稳定”的最简单方法是回到表的定义。 SQL 中的表本质上是无序的。因此,没有任何命令可以依靠“稳定”。 作为第二个考虑因素,排序可以并行实现。在大多数并行排序中,公共键被聚集在一起,没有有关其原始顺序的信息(除非在排序键中显式或隐式地实现)。


0
投票
ORDER BY

子句末尾添加主键,您可以轻松地使 SQL 排序表现得像稳定排序。

说明:由于添加行的主键隐式保留了有关初始行排序的信息(最近添加的行具有较高的 ID 值),为了保证行在排序过程中保持初始相对顺序,您只需要添加主键作为最后一个排序参数:

SELECT a,b,c from Table1 Order By a asc, b asc, id asc;

© www.soinside.com 2019 - 2024. All rights reserved.