You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:15:04