可以递归SQL查找生成树林

时间:2014-11-26 12:06:09

标签: sql-server

我有一张这样的表

create table #data (node int, linkA char(1), linkB char(2));
insert into #data
values
(1, 'a', 'aa'),
(2, 'b', 'aa'),
(3, 'a', 'xx'),
(4, 'c', 'yy'),
(5, 'b', 'zz'),
(6, 'd', 'yy')
--...,
--more than 100k rows

目标是对通过链接类型A或类型B递归链接的节点进行分组。所以在这个例子中,1通过类型B链接到2,2通过类型A进一步链接到5; 1也链接到3;所以他们都在一个小组中。

我可以使用下面的两个嵌套while循环来解决这个问题,但是你可以想象的表现非常糟糕。

declare @grp int = 0
select top 0 @grp grp, * into #x from #data
select * into #result from #x

while exists(select * from #data)
begin

    insert into #x
    select top 1 @grp, * from #data;

    while @@ROWCOUNT > 0 
    begin

        insert into #x
        select @grp, * 
        from #data d
        where exists (
            select * from #x rec 
            where d.linkA = rec.linkA
            or d.linkB = rec.linkB
            ) 
            and not exists (select * from #x where #x.node = d.node)
    end

    insert into #result
    select * from #x;

    delete #data where node in (select node from #x);

    truncate table #x;

    set @grp += 1;
end

select * from #result

当前和期望的输出:

grp | node | linkA | linkB
0   | 1    | a     | aa
0   | 2    | b     | aa
0   | 3    | a     | xx
0   | 5    | b     | zz
1   | 4    | c     | yy
1   | 6    | d     | yy

我想知道递归CTE是否可以做得更好,但我无法弄明白。任何帮助将不胜感激。

0 个答案:

没有答案