J'ai besoin d'implémenter un arbre multi-parenté (ou digraphe) sur SQL Server 2005. J'ai lu plusieurs articles, mais la plupart d'entre eux utilisent des arbres monoparentaux avec une racine unique comme la suivante.Implémentation de l'arbre parent (ou du digraphe) de SQL Server SQL Server 2005
-My PC
-Drive C
-Documents and Settings
-Program Files
-Adobe
-Microsoft
-Folder X
-Drive D
-Folder Y
-Folder Z
Dans celui-ci, tout dérive d'un élément racine (My PC).
Dans mon cas, un enfant pourrait avoir plus de 1 parent, comme ce qui suit:
G A
\/
B
/\
X C
/\
D E
\/
F
J'ai le code suivant:
create table #ObjectRelations
(
Id varchar(20),
NextId varchar(20)
)
insert into #ObjectRelations values ('G', 'B')
insert into #ObjectRelations values ('A', 'B')
insert into #ObjectRelations values ('B', 'C')
insert into #ObjectRelations values ('B', 'X')
insert into #ObjectRelations values ('C', 'E')
insert into #ObjectRelations values ('C', 'D')
insert into #ObjectRelations values ('E', 'F')
insert into #ObjectRelations values ('D', 'F')
declare @id varchar(20)
set @id = 'A';
WITH Objects (Id, NextId) AS
(-- This is the 'Anchor' or starting point of the recursive query
SELECT rel.Id,
rel.NextId
FROM #ObjectRelations rel
WHERE rel.Id = @id
UNION ALL -- This is the recursive portion of the query
SELECT rel.Id,
rel.NextId
FROM #ObjectRelations rel
INNER JOIN Objects -- Note the reference to CTE table name (Recursive Join)
ON rel.Id = Objects.NextId
)
SELECT o.*
FROM Objects o
drop table #ObjectRelations
qui renvoie le SET suivant :
Id NextId
-------------------- --------------------
A B
B C
B X
C E
C D
D F
E F
Attendu Sult SET:
Id NextId
-------------------- --------------------
G B
A B
B C
B X
C E
C D
D F
E F
Notez que la relation G-> B est absent, car il demande un objet de départ (qui ne fonctionne pas pour moi aussi, parce que je ne sais pas l'objet racine dès le début) et en utilisant A comme point de départ ignorera la relation G-> B. Donc, ce code ne fonctionne pas dans mon cas car il demande un objet de départ, ce qui est évident dans un arbre SINGLE-parent (sera toujours l'objet racine). Mais dans l'arbre multi-parent, vous pouvez avoir plus d'un objet "root" (comme dans l'exemple, G et A sont les objets "root", où root est un objet qui n'a pas de parent (ancêtre)).
Donc, je suis coincé ici ... J'ai besoin de modifier la requête pour ne pas demander un objet de départ et parcourir récursivement l'arbre entier. Je ne sais pas si c'est possible avec l'implémentation (Id, NextId) ... peut-être dois-je le stocker comme un graphe en utilisant une sorte de matrice d'Incidence, de matrice d'adjacence ou autre (voir http://willets.org/sqlgraphs.html).
Une aide? Que pensez-vous les gars? Merci beaucoup pour votre temps =)
Cheers!
Sources: Source 1 Source 2 Source 3