Hilfe bei SQL-Anfrage

jazy jaf

Grünschnabel
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:

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:

Neue Beiträge

Zurück