我正在使用以下查询来查询在两列上有 order by 的数据库。
从 Table1 中选择 a,b,c 按 a asc, b asc;
我的问题是,排序是否保证稳定(按标准)。虽然它不稳定没有任何意义,但我问这个是因为我在网上读到了
该标准并不妨碍稳定排序的使用,但它也 不需要它。
不保证排序稳定。我认为 SQL Server 文档 对如何实现稳定排序有很好的解释:
使用OFFSET和OFFSET在查询请求之间获得稳定的结果 FETCH,必须满足以下条件: 查询使用的基础数据不得更改。也就是说,要么行接触 查询未更新或所有对页面的请求均来自查询 使用快照或在单个事务中执行 可序列化事务隔离。有关这些的更多信息 事务隔离级别,请参阅设置事务隔离级别 (事务 SQL)。 ORDER BY 子句包含列或组合 保证唯一的列。
了解排序“不稳定”的最简单方法是回到表的定义。 SQL 中的表本质上是无序的。因此,没有任何命令可以依靠“稳定”。 作为第二个考虑因素,排序可以并行实现。在大多数并行排序中,公共键被聚集在一起,没有有关其原始顺序的信息(除非在排序键中显式或隐式地实现)。
ORDER BY
子句末尾添加主键,您可以轻松地使 SQL 排序表现得像稳定排序。
说明:由于添加行的主键隐式保留了有关初始行排序的信息(最近添加的行具有较高的 ID 值),为了保证行在排序过程中保持初始相对顺序,您只需要添加主键作为最后一个排序参数:SELECT a,b,c from Table1 Order By a asc, b asc, id asc;