我有一张这样的表
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是否可以做得更好,但我无法弄明白。任何帮助将不胜感激。