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