Ich kann Rekursion erreichen, indem Sie den With-Befehl (CTE) von SQL Server verwenden.Reihenfolge der Rekursion (SQL Server CTE)
WITH MyCTE(ParentID,ID,Name,Level)
AS
(
SELECT ManagerID AS ParentID, UserID AS ID, UserName AS Name, 0 AS Level
FROM USERS U
WHERE U.ManagerID IS NULL
UNION ALL
SELECT U.ManagerID AS ParentID, U.UserID AS ID, U.UserName AS Name, H.Level+1 AS Level
FROM USERS U
INNER JOIN MyCTE H ON H.ID = U.ManagerID
)
SELECT ParentID,ID FROM MyCTE
kehrt
ParentID ID
NULL 1
1 2
1 3
2 4
Was ich erreichen will, ist dieses Ergebnis Satz umkehren. Das heißt, die Umkehr der Wurzelknoten und die tiefste Kindknoten als,
ParentID ID
NULL 4
4 2
2 1
3 1
konnte nicht herausfinden, wie programmatisch dies zu implementieren (vorzugsweise durch CTE verwendet wird), wie durch einen Parameter mit Hilfe der Rekursion Reihenfolge etc. Jede bestimmen Hilfe wird sehr geschätzt, danke.
Edit:
Modified dieses ein wenig meine erste CTE Ergebnisse in eine temporäre Tabelle einfügen, dann eine weitere Rekursion ich die Reihenfolge umkehren, wie (ich weiß „WHERE T.ID = (SELECT MAX (ID) von @ tmp)“wird nicht funktionieren in einer realen Situation, ich muss auch den tiefsten Knoten mit der Bestimmung‚Pegel‘Spalte, habe gerade versucht, dies für dieses Beispiel zu vereinfachen),
INSERT INTO @tmp
SELECT ParentID,ID,Level FROM MyCTE
WITH MyCTE2(ParentID,ID,Level)
AS
(
SELECT NULL AS ParentID, ID AS ID, 0 AS Level FROM @tmp T
WHERE T.ID = (SELECT MAX(ID) FROM @tmp)
UNION ALL
SELECT R2.ID AS ParentID, T.ParentID AS ID, R2.Level+1 FROM @tmp T
INNER JOIN MyCTE2 R2 ON R2.ID = T.ID
WHERE T.ParentID IS NOT NULL
)
Original-Ergebnisse (entfernt, um das 1,3 Paar)
ParentID ID Level
NULL 1 0
1 2 1
2 4 2
Reversed Ergebnisse,
ParentID ID Level
NULL 4 0
4 2 1
2 1 2
Edit 2:
Ich habe so etwas wie dies,
SELECT TTT.ParentID,TTT.ID,TTT.Level FROM
(
SELECT ParentID,ID,Level FROM MyCTE2
UNION ALL
SELECT TT.ID AS ParentID,TT.ParentID AS ID,(SELECT Level+1 FROM @tmp WHERE ID=TT.ID)
AS Level FROM
(
SELECT ID FROM @tmp
EXCEPT
SELECT ID FROM MyCTE2
)T INNER JOIN @tmp TT ON TT.ID = T.ID
)TTT
ORDER BY TTT.Level
gibt,
ParentID ID Level
NULL 4 0
4 2 1
2 1 2
3 1 2
Dieser Fehler, im nicht sicher, noch enthalten , wollte nur zeigen, um sicherzustellen, dass das Paar (3,1) stimmt mit Niveau 2? Nachdem ich schon eine ganze Weile darüber nachgedacht habe, könnte ich einige dumme Fehler machen.
@MartinSmith, die nicht arbeiten, lesen Sie die Post sorgfältig. – JonH
@MartinSmith erstellen die Hierarchie in umgekehrter Reihenfolge neu. – JonH
Sie müssen zuerst die Hierarchie erstellen, also fügen Sie grundsätzlich ein weiteres CTE nach Ihrem vorhandenen CTE hinzu, um rückwärts zu gehen. Es gibt keine Möglichkeit zu wissen, wie viele Ebenen tief etwas ist, ohne zuerst den Baum zu bauen. – JNK