SQL Server의 With 명령 (CTE)을 사용하여 재귀를 수행 할 수 있습니다.재귀 순서 (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
반환
ParentID ID
NULL 1
1 2
1 3
2 4
내가 달성하고자하는 것은이 결과 세트를 반대합니다. 즉, 루트 노드와 같은 깊은 자식 노드를 반전
ParentID ID
NULL 4
4 2
2 1
3 1
매개 변수를 사용하여 등 모든를 재귀 순서를 결정하는 것처럼 프로그래밍, (바람직하게는 CTE를 사용하여)이를 구현하는 방법을 알아낼 수 없습니다 도움이 대단히 감사합니다, 감사합니다.
편집 :
이 나는대로 순서를 반대로 다른 재귀를 사용하여 임시 테이블에 처음 CTE의 결과를 삽입이 조금 수정 (I는 WHERE T.ID = (@ FROM MAX (ID)를 선택 "알고 TMP)
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
)
원래 결과 (1,3 쌍을 제거 단지)이 예를 들어이를 단순화하려고 수준 "열"실제 상황에서 늘 작품은, 나는 또한 함께 깊은 노드를 결정 해 ")
ParentID ID Level
NULL 1 0
1 2 1
2 4 2
개
반전 결과,
ParentID ID Level
NULL 4 0
4 2 1
2 1 2
편집 :이 오류가있을 수 있습니다
ParentID ID Level
NULL 4 0
4 2 1
2 1 2
3 1 2
내가 이런 일을했다,
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
주는, 메신저하지 않도록 아직 , 단지 쌍 (3,1)이 레벨 2와 맞는지 확인하기 위해 보여주고 싶습니까? 꽤 오랫동안 이것을 생각해 봤는데, 어리석은 실수를 저지를 수도 있습니다. 루트에서
@MartinSmith 작동하지 않는 게시자는 신중하게 게시물을 읽습니다. – JonH
@MartinSmith는 역순으로 계층 구조를 다시 만듭니다. – JonH
먼저 계층 구조를 만들어야하므로 기본적으로 기존 CTE 뒤에 다른 CTE를 추가하여 뒤로 이동해야합니다. 트리를 먼저 구축하지 않고 얼마나 많은 레벨이 깊은지를 알 수있는 방법이 없습니다. – JNK