Multiple tree parent (or digraph) sql server 2005
Preciso implementar uma árvore com vários parentais (ou um dígrafo) no SQL Server 2005. Li vários artigos, mas a maioria deles usa árvores com um único pai com uma raiz única, como a seguint
-My PC
-Drive C
-Documents and Settings
-Program Files
-Adobe
-Microsoft
-Folder X
-Drive D
-Folder Y
-Folder Z
Neste, tudo deriva de um elemento raiz (Meu PC
No meu caso, um filho pode ter mais de um pai, como o seguinte:
G A
\ /
B
/ \
X C
/ \
D E
\ /
F
Então, tenho o seguinte código:
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
Que retorna o seguinte SET:
Id NextId
-------------------- --------------------
A B
B C
B X
C E
C D
D F
E F
Resultado esperado SET:
Id NextId
-------------------- --------------------
G B
A B
B C
B X
C E
C D
D F
E F
Observe que a relação G-> B está ausente, porque pede um objeto inicial (o que também não funciona para mim, porque não conheço o objeto raiz desde o início) e usar A como ponto de partida ignore o relacionamento G-> B.
Então, esse código não funciona no meu caso, porque solicita um objeto inicial, o que é óbvio em uma árvore pai ÚNICA (sempre será o objeto raiz). Mas na árvore multiparental, você pode ter mais de 1 objeto "raiz" (como no exemplo, G e A são os objetos "raiz", em que raiz é um objeto que não tem pai (ancestral)).
Então, eu meio que estou presa aqui ... Preciso modificar a consulta para NÃO pedir um objeto inicial e percorrer recursivamente a árvore inteira. Não sei se isso é possível com a implementação (Id, NextId) ... talvez seja necessário armazená-lo como um gráfico usando algum tipo de matriz de incidência, matriz de adjacência ou qualquer outra coisa (consultehttp: //willets.org/sqlgraphs.htm).
Qualquer ajuda? O que vocês acham pessoal? Muito obrigado pelo seu tempo =)
Felicidades