我有一个表,表示来自另一个表的ID之间的一系列匹配,如下所示:
CREATE TABLE #matches (
asid1 int,
asid2 int
)
insert into #matches values (1,2)
insert into #matches values (1,3)
insert into #matches values (3,1)
insert into #matches values (3,4)
insert into #matches values (7,6)
insert into #matches values (5,7)
insert into #matches values (8,1)
insert into #matches values (1,8)
insert into #matches values (8,9)
insert into #matches values (8,3)
insert into #matches values (10,11)
insert into #matches values (12,10)
我希望找到直接或间接相互关联的匹配组。
输出如下:
group asid
1 1
1 2
1 3
1 4
1 8
1 9
2 5
2 6
2 7
3 10
3 11
3 12
如果我要添加另一行:
insert into #matches values (7,8)
然后这意味着上面的两个组将被链接,所以我需要输出:
group asid
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
2 10
2 11
2 12
有什么想法吗?
编辑:进一步的研究让我相信一个递归的公用表表达式可以做到这一点......如果我找到一些优雅的东西我会发布它
答案 0 :(得分:1)
看来你需要Disjoint-set来解决这个问题。这是C#和C ++实现的listing。
答案 1 :(得分:0)
如果这可以在SQL中完成,那将是非常困难的。您应该使用您正在使用的任何编程语言来分析该表。
答案 2 :(得分:0)
如果您使用的是Oracle,那么CONNECT TO命令非常棒。 Tom Kyte对此有一个很好的写作,回答看似基本相同的问题:
http://www.oracle.com/technology/oramag/oracle/05-may/o35asktom.html
查看“层次结构扩展”部分。