Hallo,
vielleicht kann mir jemand bei der Lösung des folgenden Problemes helfen.
Als Datenbank liegt der MS SQL Server 2005 zugrunde.
Die Tabelle ist schlecht designed (nicht normalisiert) aber ich habe keinerlei Einfluss darauf und muss damit irgendwie zurecht kommen...aber zum Problem.
Die Tabelle auf der ich arbeite hat folgende (auf die relevanten Spalten vereinfachte) Struktur
(hier mit ein paar Testdaten befüllt)
projectid.........|...name..........................|...parentid
-----------------------------------------------------------------------------------
1.......................|...Hauptprojekt..............|...NULL
2.......................|...Unterprojekt_level1..|...1
3.......................|...Unterprojekt_level1..|...1
4.......................|...Unterprojekt_level2..|...2
5.......................|...Hauptprojekt..............|...NULL
6.......................|...Unterprojekt_level1..|...5
7.......................|...Unterprojekt_level2..|... 6
8.......................|...Unterprojekt_level3..|...7
9.......................|...Unterprojekt_level1..|...5
usw.
Es gibt also Hauptprojekte die keine parentid haben und jedes Projekt kann beliebig viele Unterprojekte haben. Unterprojekte können wiederum in beliebiger tiefe jeweils Unterprojekte haben...eine klassische Baumstruktur (wobei die Tiefe -wahrscheinlich- nicht über 4 hinausgeht, d.h. Hauptprojekt>Unterprojekt_level1>Unterprojekt_level2>Unterprojekt_level3>Unterprojekt_level4)
In der parentid steht logischerweise zu jedem Unterprojekt sein direktes Vaterprojekt.
So jetzt zu meinem Problem:
Ich brauche eine Anfrage, um zu allen Unterprojekten_level1 deren Unterprojekte zu erhalten, d.h. für das obige Beispiel suche ich die Anfrage, die mir folgendes Ergebnis liefert:
projectid.........|...name..........................|...parentid
-----------------------------------------------------------------------------------
2.......................|...Unterprojekt_level1..|...1
3.......................|...Unterprojekt_level1..|...1
4.......................|...Unterprojekt_level2..|...2
6.......................|...Unterprojekt_level1..|...5
7.......................|...Unterprojekt_level2..|...6
8.......................|...Unterprojekt_level3..|...6 statt vorher 7
9.......................|...Unterprojekt_level1..|...5
d.h. für mich sind sozusagen alle Unterprojekt_level1 die Hauptprojekte und mich interessiert dadrunter nicht der Link jedes Unterprojektes zu seinem Vater, sondern der Link aller Unterprojekte in beliebiger tiefe zu deren Unterprojekt_level1.
Ich hoffe, dass war verständlich ausgedrückt.
Wahrscheinlich könnte man mit einem rekursiven Ansatz hier eine Lösung finden, wobei die Tiefe des Baumes bei der Rekursion dann egal wäre.
Alternativ könnte man mit Joins arbeiten, wobei ich mich hier auf eine bestimmte tiefe der Baumstruktur festlegen müsste.
Ich habe jedenfalls einige vergebliche Versuche in den letzten 2 Tagen gestartet
Der noch am erfolgsversprechendsde Ansatz ist folgender mit Rekursion:
Hierbei bekomme ich im Grunde genau das, was ich wollte...ABER in der Spalte pathstr
steht immer der komplette pfad von Unterprojekt_level1 bis zum tiefsten Kind-Projekt,
also z.B. " > 2 > 19 > 5 > 146" bei einer Tiefe von 4
Mich würde hier aber z.B. nur die ID 2 interessiere, welche die ID des entspr. Unterprojekt_level1 wäre.
Kennt jemand eine Lösung oder alternativ eine Möglichkeit, um (im SQL...nicht programmatisch) im SELECT einer spalte, den Inhalt (String) zu splitten?
Dann könnte ich nämlich die Unterprojekt_level1 aus dem pathstr. rausextrahieren.
Vielen Dank für jede Hilfe
vielleicht kann mir jemand bei der Lösung des folgenden Problemes helfen.
Als Datenbank liegt der MS SQL Server 2005 zugrunde.
Die Tabelle ist schlecht designed (nicht normalisiert) aber ich habe keinerlei Einfluss darauf und muss damit irgendwie zurecht kommen...aber zum Problem.
Die Tabelle auf der ich arbeite hat folgende (auf die relevanten Spalten vereinfachte) Struktur
(hier mit ein paar Testdaten befüllt)
projectid.........|...name..........................|...parentid
-----------------------------------------------------------------------------------
1.......................|...Hauptprojekt..............|...NULL
2.......................|...Unterprojekt_level1..|...1
3.......................|...Unterprojekt_level1..|...1
4.......................|...Unterprojekt_level2..|...2
5.......................|...Hauptprojekt..............|...NULL
6.......................|...Unterprojekt_level1..|...5
7.......................|...Unterprojekt_level2..|... 6
8.......................|...Unterprojekt_level3..|...7
9.......................|...Unterprojekt_level1..|...5
usw.
Es gibt also Hauptprojekte die keine parentid haben und jedes Projekt kann beliebig viele Unterprojekte haben. Unterprojekte können wiederum in beliebiger tiefe jeweils Unterprojekte haben...eine klassische Baumstruktur (wobei die Tiefe -wahrscheinlich- nicht über 4 hinausgeht, d.h. Hauptprojekt>Unterprojekt_level1>Unterprojekt_level2>Unterprojekt_level3>Unterprojekt_level4)
In der parentid steht logischerweise zu jedem Unterprojekt sein direktes Vaterprojekt.
So jetzt zu meinem Problem:
Ich brauche eine Anfrage, um zu allen Unterprojekten_level1 deren Unterprojekte zu erhalten, d.h. für das obige Beispiel suche ich die Anfrage, die mir folgendes Ergebnis liefert:
projectid.........|...name..........................|...parentid
-----------------------------------------------------------------------------------
2.......................|...Unterprojekt_level1..|...1
3.......................|...Unterprojekt_level1..|...1
4.......................|...Unterprojekt_level2..|...2
6.......................|...Unterprojekt_level1..|...5
7.......................|...Unterprojekt_level2..|...6
8.......................|...Unterprojekt_level3..|...6 statt vorher 7
9.......................|...Unterprojekt_level1..|...5
d.h. für mich sind sozusagen alle Unterprojekt_level1 die Hauptprojekte und mich interessiert dadrunter nicht der Link jedes Unterprojektes zu seinem Vater, sondern der Link aller Unterprojekte in beliebiger tiefe zu deren Unterprojekt_level1.
Ich hoffe, dass war verständlich ausgedrückt.
Wahrscheinlich könnte man mit einem rekursiven Ansatz hier eine Lösung finden, wobei die Tiefe des Baumes bei der Rekursion dann egal wäre.
Alternativ könnte man mit Joins arbeiten, wobei ich mich hier auf eine bestimmte tiefe der Baumstruktur festlegen müsste.
Ich habe jedenfalls einige vergebliche Versuche in den letzten 2 Tagen gestartet

Der noch am erfolgsversprechendsde Ansatz ist folgender mit Rekursion:
Code:
WITH tree (projectid, level, project, pathstr)
AS (
SELECT Project.uid, 0, Project.name, CAST('' AS VARCHAR(MAX))
FROM Project
WHERE Project.parentid IS NULL
UNION ALL
SELECT P.uid, t.level + 1, P.name, t.pathstr + ' > ' + CAST(P.uid AS VARCHAR(MAX))
FROM Project P
INNER JOIN
tree t ON t.projectid = P.parentid
)
SELECT tree.*
FROM tree
WHERE level > 0 --damit filtere ich die Hauptprojekte aus, die mich nich interessieren
ORDER BY level
Hierbei bekomme ich im Grunde genau das, was ich wollte...ABER in der Spalte pathstr
steht immer der komplette pfad von Unterprojekt_level1 bis zum tiefsten Kind-Projekt,
also z.B. " > 2 > 19 > 5 > 146" bei einer Tiefe von 4
Mich würde hier aber z.B. nur die ID 2 interessiere, welche die ID des entspr. Unterprojekt_level1 wäre.
Kennt jemand eine Lösung oder alternativ eine Möglichkeit, um (im SQL...nicht programmatisch) im SELECT einer spalte, den Inhalt (String) zu splitten?
Dann könnte ich nämlich die Unterprojekt_level1 aus dem pathstr. rausextrahieren.
Vielen Dank für jede Hilfe
Zuletzt bearbeitet: