Was ist der einfachste Weg, um einen rekursiven Self-Join in SQL Server durchzuführen? Ich habe einen Tisch wie diesen:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
5 YT NULL
6 IS 5
Und ich möchte in der Lage sein, die Datensätze nur in Bezug auf eine Hierarchie ab einer bestimmten Person abzurufen. Wenn ich also die Hierarchie von CJ mit PersonID = 1 anfordern würde, würde ich Folgendes erhalten:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
Und für EBs würde ich bekommen:
PersonID | Initials | ParentID
2 EB 1
4 SW 2
Ich bin ein bisschen festgefahren, kann mir nicht vorstellen, wie ich es machen soll, abgesehen von einer Antwort mit fester Tiefe, die auf einer Reihe von Joins basiert. Dies würde so tun, wie es passiert, weil wir nicht viele Level haben, aber ich würde es gerne richtig machen.
Vielen Dank! Chris.
Antworten:
Durch Hinzufügen der Bestellbedingung können Sie die Baumreihenfolge beibehalten:
Durch Ändern der
ORDER BY
Bedingung können Sie die Reihenfolge der Geschwister ändern.quelle
PersonID = theIdYouAreLookingFor
stattdessen brauchen würdeParentID IS NULL
.WITH
Klausel definiert. Wenn Sie Einzelheiten benötigen, erstellen Sie bitte eine Geige auf sqlfiddle.com und veröffentlichen Sie den Link hier.Mit CTEs können Sie dies auf diese Weise tun
quelle
Die Quassnoi-Abfrage mit einer Änderung für große Tabelle. Eltern mit mehr Kindern als 10: Formatieren der Zeilennummer () als str (5)
quelle
SQL 2005 oder höher sind CTEs gemäß den gezeigten Beispielen der Standard.
SQL 2000 können Sie dies mit UDFs tun -
(was 2005 funktionieren wird, ist einfach nicht die Standardmethode. Wenn Sie jedoch feststellen, dass dies die einfachere Arbeitsweise ist, führen Sie es aus.)
Wenn Sie dies in SQL7 wirklich tun müssen, können Sie ungefähr das oben Genannte in einem Sproc ausführen, konnten jedoch keine Auswahl treffen - SQL7 unterstützt keine UDFs.
quelle
Überprüfen Sie Folgendes, um das Konzept der CTE-Rekursion besser zu verstehen
quelle