2008-12-19 4 views
1

J'ai une table qui représente une série de correspondances entre ids d'une autre table comme suit:groupes de liaison des matches

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) 

et je veux trouver des groupes de matchs qui sont liés directement ou indirectement à un autre.

La sortie ressemblerait à ceci:

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 

si je devais ajouter une autre ligne:

insert into #matches values (7,8) 

alors cela signifierait que deux des groupes ci-dessus seraient liés, donc je require output:

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 

Des idées?

Edit: D'autres recherches me conduit à croire qu'une expression de table commune récursive devrait faire l'affaire ... si je figure sur quelque chose d'élégant, je vais le poster

Répondre

1

Il semble qu'un Disjoint-set est ce que vous devez résoudre ceci. Voici une listing d'une implémentation C# et C++.

+0

cet algo s'est avéré être exactement le genre de chose que nous recherchions. Merci beaucoup de m'avoir indiqué la bonne direction. la version sql est toujours en attente :) – spender

+0

Pas de problème! J'ai dû mettre en place ma propre version C++ au collège. C'est la seule raison pour laquelle je me suis souvenu de ce que c'était. – EndangeredMassa

0

Si cela peut être fait du tout dans SQL, cela va être incroyablement difficile. Vous devriez analyser cette table dans le langage de programmation que vous utilisez.

0

Si vous utilisez Oracle, la commande CONNECT TO est brillante. Tom Kyte a une belle writeup à ce sujet, répondant à ce qui semble être essentiellement votre même question:

http://www.oracle.com/technology/oramag/oracle/05-may/o35asktom.html

Vérifiez la section "Hiérarchie d'extension".

+0

Malheureusement, nous utilisons MSSQL ... sinon ce serait la solution parfaite. – spender

Questions connexes