在包含子串的sql中组合组

时间:2015-06-17 22:34:33

标签: sql-server

我提前道歉,因为没有很好地解释这一点。 我有一个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

我一直在谷歌上搜索没有太多运气。任何帮助是极大的赞赏。 感谢。

1 个答案:

答案 0 :(得分:0)

因此,您希望递归替换group -column中的任何项目,其中包含在column1中具有该值的其他行中找到的任何值?至少你可以这样做:

  1. 将数据拆分为行,因此只有column1 - >群体关系
  2. 获取可用作根节点的任何值,我的方法取最小值,因为您的数据有一个圆圈(3323052 - > 3324794 - > 3323052)
  3. 以递归方式获取可从这些根节点下的层次结构中找到的所有值
  4. 将其重新组合成原始格式
  5. 此示例使用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

    中对此进行测试