Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 递归SQL能找到生成树林吗_Sql Server - Fatal编程技术网

Sql server 递归SQL能找到生成树林吗

Sql server 递归SQL能找到生成树林吗,sql-server,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进行递归链接的节点进行分

我有一张这样的桌子

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
电流和期望输出:


我想知道递归CTE是否能做得更好,但我不明白。任何帮助都将不胜感激。

我想知道递归CTE是否能做得更好。。。是的。你能添加你想要的输出吗?因为我不明白你的意思:目标是对通过链接类型A或类型B递归链接的节点进行分组。想要的结果在最后一个语句中,从结果中选择*,最好在问题中显示出来,但是,任何其他能够显示不同群体的合理方式也是好的。
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