Ich brauche einen Multi-parented Baum (oder Digraph) auf SQL Server zu implementieren 2005 Ich habe mehrere Artikel gelesen, aber die meisten von ihnen verwendet Single-parented Bäume mit eine einzigartige Wurzel wie die folgende.Mehrere Eltern Baum (oder Digraph) Implementierung von SQL Server 2005
-My PC
-Drive C
-Documents and Settings
-Program Files
-Adobe
-Microsoft
-Folder X
-Drive D
-Folder Y
-Folder Z
In diesem Fall stammt alles von einem Wurzelelement (My PC).
In meinem Fall könnte ein Kind mehr als 1 Elternteil haben, wie folgt aus:
G A
\/
B
/\
X C
/\
D E
\/
F
So habe ich den folgenden Code:
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
, die die folgenden SET zurück :
Id NextId
-------------------- --------------------
A B
B C
B X
C E
C D
D F
E F
Erwartete re Sult SET:
Id NextId
-------------------- --------------------
G B
A B
B C
B X
C E
C D
D F
E F
Beachten Sie, dass die Beziehung G> B fehlt, weil es für ein Start-Ziel fragt (was nicht für mich auch nicht funktioniert, weil ich von Anfang an das Wurzelobjekt nicht kennen) und die Verwendung von A als Startpunkt ignoriert die G-> B-Beziehung.
Also funktioniert dieser Code in meinem Fall nicht, weil er nach einem Startobjekt fragt, was in einem EINZEL-Elternbaum offensichtlich ist (wird immer das Wurzelobjekt sein). Aber in einem Baum mit mehreren Elternteilen könnten Sie mehr als 1 "root" -Objekt haben (wie im Beispiel, G und A sind die "root" -Objekte, wobei root ein Objekt ist, das kein Elternteil (Vorfahre) hat).
Also bin ich irgendwie hier stecken geblieben ... Ich muss die Abfrage ändern, um nicht nach einem Startobjekt zu fragen und rekursiv den gesamten Baum zu durchlaufen. Ich weiß nicht, ob das mit der (Id, NextId) Implementierung möglich ist ... vielleicht muss ich es wie ein Diagramm speichern, indem ich irgendeine Art von Inzidenzmatrix, Adjazenzmatrix oder was auch immer verwende (siehe http://willets.org/sqlgraphs.html).
Irgendwelche Hilfe? Was denkt ihr Leute? Vielen Dank für Ihre Zeit =)
Prost!
Quellen: Source 1 Source 2 Source 3