连接匹配组

时间:2008-12-19 14:50:26

标签: sql sql-server tsql

我有一个表,表示来自另一个表的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

有什么想法吗?

编辑:进一步的研究让我相信一个递归的公用表表达式可以做到这一点......如果我找到一些优雅的东西我会发布它

3 个答案:

答案 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

查看“层次结构扩展”部分。