我提前道歉,因为没有很好地解释这一点。 我有一个sql数据库,其中包含一些数据:
column1 | groups
3323052 | 3323052,3324794,3324795
3324794 | 3323052,3324794
3324794 | 3324794
3324794 | 3324794,3763369
3353586 | 3353586
3763369 | 3324794,3763369
我想组合组,以便如果一个数字在两个组中,组将合并,并且该数字将仅在列表中显示一次。
例如,最终结果如下所示:
基
3323052,3324794,3324795,3763369
3353586
我一直在谷歌上搜索没有太多运气。任何帮助是极大的赞赏。 感谢。
答案 0 :(得分:0)
因此,您希望递归替换group -column中的任何项目,其中包含在column1中具有该值的其他行中找到的任何值?至少你可以这样做:
此示例使用Jeff Moden的DelimitedSplit8k:
-- Step 1:
select distinct
d.column1,
convert(int, s.Item) as item
into #tmp
from
data d
cross apply DelimitedSplit8k(d.groups, ',') s
-- Step 2:
select distinct
column1
into #root
from #tmp t1
where not exists
(select 1 from #tmp t2 where t2.item = t1.column1 and t2.item > t2.column1)
-- Step 3:
;with CTE (root, parent, child) as (
select r.column1, r.column1, r.column1 from #root r
union all
select C.root, t.column1, t.item
from CTE C join #tmp t on t.column1 = C.child and t.item > C.parent
)
select distinct * into #results from CTE
-- Step 4:
SELECT r.column1, STUFF((SELECT distinct ', ' + convert(varchar(50), r2.child)
FROM #results r2
WHERE r2.root = r.column1
ORDER BY ', ' + convert(varchar(50), r2.child)
FOR XML PATH(N'')), 1, 2, '') as groups
FROM #root r
GROUP BY column1
ORDER BY column1
结果:
column1 groups
3323052 3323052, 3324794, 3324795, 3763369
3353586 3353586
我用过temp。表格确保每个步骤只执行一次,但我相信只用一个选择并使用CTE而不是临时表来完成整个操作。
您可以在SQL Fiddle
中对此进行测试