关于排序后查询结果集不稳定的问题

  1. 为什么子查询用了函数会导致结果集不稳定

这个问题不对。不是子查询用了函数导致的结果集不稳定,而是这个查询的结果本身是不保证稳定的。
这条 SQL 只一能给的保证是,结果是按 order by C 有序的,每次的结果集内容是一致的。
其它都是未定义行为,依赖于实现细节。
子查询里面不用 max 函数的时候,走的是一个 Apply 算子,更低效的实现,它恰好给你了一个有序的结果。而用 max 的时候,Apply 算子被优化成 HashJoin 了,是更高效的并发实现,高效并发的副产品是返回结果也不稳定了

  1. 对于单表查询的话,如果排序字段有值重复了,最终的输出结果是按什么规则确定顺序的

未定义行为。如果期望在排序字段重复的情况下,得到一个有序的结果,那么应该用多列组合去排序。
这样写出来的 SQL 才是跨实现通用的。

1 个赞