2012-09-02 2 views
2

나는 다음과 같은 이진 트리를 저장하는 테이블을 만든 :T-SQL 바이너리 트리의 자식 노드를 계산 하시겠습니까?

- NodeID 
- NodeLeft 
- NodeRight 

왼쪽 노드의 ID를 저장 NodeLeft. 그리고 노드는 올바른 노드의 ID를 올바르게 저장합니다.

NodeID를 전달하면 왼쪽에 몇 개의 자식 노드가 있고 오른쪽에 몇 개의 자식 노드가 있는지 계산하는 절차를 작성해야합니다. 2 절차로 분리 할 수 ​​있습니다.

+0

재귀 공통 테이블 식을 조사해야합니다. –

+0

당신은 무엇을 시도 했습니까? –

답변

4

이 시도 : 여기

WITH CTE_Node(
    NodeID, 
    NodeRigth, 
    NodeLeft, 
    Level, 
    RigthOrLeft 
) 
AS 
(
SELECT 
NodeID, 
    NodeRigth, 
    NodeLeft, 
    0 AS Level, 
    'P' 
    FROM Node 
    WHERE NodeID = 1 

    UNION ALL 

    SELECT 
Node.NodeID, 
    Node.NodeRigth, 
    Node.NodeLeft, 
    Level + 1, 
    CASE WHEN CTE_Node.NodeLeft = Node.NodeID THEN 'R' ELSE 'L' END 
    FROM Node 
INNER JOIN CTE_Node ON CTE_Node.NodeLeft = Node.NodeID 
    OR CTE_Node.NodeRigth = Node.NodeID 
) 
SELECT DISTINCT RigthOrLeft, 
COUNT(NodeID) OVER(PARTITION BY RigthOrLeft) 
FROM CTE_Node 

SQL Fiddle입니다. 레벨은 어떻게 작동하는지 볼 수 있습니다. 나중에 사용할 수 있습니다.

+0

도움 주셔서 감사합니다. 그러나 테이블에 노드를 더 추가하면 결과는 항상 동일합니다. –

관련 문제