如何在SQL中生成各位置对应值列表的所有值组合
多位置分组值全排列拼接SQL实现方案
实现思路
- 首先为所有位置分组分配递增序号,按groupId升序排序保证拼接顺序和位置先后一致
- 用递归CTE逐层处理每个分组的可选值,每递归一层就把当前已拼接的字符串和下一分组的所有可选值拼接
- 递归到所有分组都处理完成后,输出最终的拼接结果即可,不需要硬编码分组数量,适配任意数量的分组和每组可选值
完整实现代码
Declare @Table Table ( groupId int, value int ) Insert Into @Table Select 1,1 union select 1,2 union select 1,3 union select 2,8 union select 3,5 union select 3,6; -- 为所有分组分配序号,确定拼接顺序 WITH GroupOrders AS ( SELECT groupId, ROW_NUMBER() OVER(ORDER BY groupId) AS rn FROM @Table GROUP BY groupId ), -- 递归生成所有拼接组合 RecursiveCombinations AS ( -- 初始层:取第一个分组的所有值作为初始字符串 SELECT CAST(t.value AS VARCHAR(MAX)) AS combined_str, g.rn AS current_group_rn FROM @Table t INNER JOIN GroupOrders g ON t.groupId = g.groupId WHERE g.rn = 1 UNION ALL -- 递归层:拼接下一个分组的所有可选值 SELECT rc.combined_str + CAST(t.value AS VARCHAR(MAX)), g.rn AS current_group_rn FROM RecursiveCombinations rc INNER JOIN GroupOrders g ON g.rn = rc.current_group_rn + 1 INNER JOIN @Table t ON t.groupId = g.groupId ) -- 输出处理完所有分组的最终结果 SELECT combined_str AS Output FROM RecursiveCombinations WHERE current_group_rn = (SELECT MAX(rn) FROM GroupOrders) ORDER BY combined_str
小提示:如果你的分组数量超过100,需要在查询语句最后添加
OPTION (MAXRECURSION 0)解除递归深度限制,避免执行报错。
输出结果验证
运行代码后得到的结果和预期一致:
| Output |
|---|
| 185 |
| 186 |
| 285 |
| 286 |
| 385 |
| 386 |
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

