SQL Server无ID层级排序问题:自定义规则排序及递归CTE报错解决
解决SQL排序需求的非递归方案
核心思路
完全不用递归CTE,直接靠ORDER BY里的自定义排序键就能实现所有规则,还能支持任意列数的表,简单高效。
具体代码
假设你的表叫YourTable,直接用这段SQL:
SELECT * FROM YourTable ORDER BY -- 第一步:把Column1和Column2都是'Points'的行放在整张表最前面 CASE WHEN Column1 = 'Points' AND Column2 = 'Points' THEN 0 ELSE 1 END, -- 第二步:每个Column1分组里,先放Column2是'Points'的行 CASE WHEN Column2 = 'Points' THEN 0 ELSE 1 END, -- 第三步:整张表和每个分组内部,按Rank降序排 Rank DESC;
规则对应说明
- 第一个CASE让
Points/Points的行拿到排序优先级0,其他行是1,自然就顶在最前面。 - 第二个CASE保证每个Column1分类下,Column2为'Points'的行不管Rank多少,都排在同组其他行的前面。
- 最后按Rank降序,满足整张表和各分类内部的排序要求。
支持多列表的扩展
不管你的表有多少列,只要保留SELECT *或者明确写出需要查询的列就行——排序逻辑只依赖Column1、Column2和Rank这三个字段,和其他列没关系,完全不用改排序部分的代码。
为啥别用递归CTE?
递归CTE是用来处理树形、层级这类复杂结构数据的,你的需求就是个多规则排序,用递归纯属用错工具,还容易触发SSMS默认的递归深度限制(最多100次)导致报错。直接用ORDER BY加CASE表达式才是最直接高效的办法。
内容的提问来源于stack exchange,提问作者puk82
相关产品推荐
相关产品推荐

