SQL如何从临时表中获取所有不重复的无序元素组合
通用无顺序去重组合SQL实现方案
实现逻辑
通过给每个元素分配唯一递增序号,递归拼接时仅加入序号大于当前组合最大序号的元素,天然保证组合内元素顺序固定,不会生成逆序重复的同元素组合,无需额外去重操作,支持最多16个元素的组合生成需求。
完整代码
测试建表语句
CREATE TABLE #Test ( ItemName VARCHAR(2) ); INSERT INTO #Test (ItemName) VALUES ('x1'), ('x2'), ('x3'), ('x4');
组合生成查询语句
WITH RankedItems AS ( -- 给所有元素分配唯一递增序号,适配任意命名规则的元素 SELECT ItemName, ROW_NUMBER() OVER(ORDER BY ItemName) AS rn FROM #Test ), Combinations AS ( -- 递归锚点:初始为单个元素的组合 SELECT rn AS max_rn, CAST(ItemName AS VARCHAR(200)) AS combination, 1 AS length FROM RankedItems UNION ALL -- 递归拼接:仅加入序号更大的元素,避免生成重复组合 SELECT r.rn AS max_rn, CAST(c.combination + ', ' + r.ItemName AS VARCHAR(200)) AS combination, c.length + 1 AS length FROM Combinations c INNER JOIN RankedItems r ON r.rn > c.max_rn ) -- 过滤单元素组合,按长度、内容排序和期望输出一致 SELECT combination FROM Combinations WHERE length >= 2 ORDER BY length, combination OPTION (MAXRECURSION 100); -- 递归上限远高于16个元素的需求,可直接复用
输出结果
针对测试数据执行后输出完全符合要求:
x1, x2 x1, x3 x1, x4 x2, x3 x2, x4 x3, x4 x1, x2, x3 x1, x2, x4 x1, x3, x4 x2, x3, x4 x1, x2, x3, x4
扩展说明
16个元素场景下总组合数仅为65519条,查询性能无压力。如果元素命名规则特殊,仅需要调整RankedItems中ROW_NUMBER()的排序规则即可适配,无需修改后续逻辑。
内容的提问来源于stack exchange,提问作者Jeff Brady
相关产品推荐
相关产品推荐

