복붙노트

[SQL] 트리 구조의 모든 구성원을 찾기

SQL

트리 구조의 모든 구성원을 찾기

나는이 형식에 트리 형식의 테이블을 상속

StatementAreaId | ParentStatementAreaId | SubjectId | Description
-----------------------------------------------------------------
1               | 0                     | 100       | Reading
2               | 0                     | 110       | Maths
3               | 2                     | 0         | Number
4               | 2                     | 0         | Shape
5               | 3                     | 0         | Addition
6               | 3                     | 0         | Subtraction

궁극적 인 부모 피사체가 어디 모든 StatementAreaIds를 찾으려면, 수학 (즉 SubjectId = 110) 말한다. SubjectId이 수학 인 경우 예를 들어 나는 나무에서 StatementAreaIds의 목록을 얻을 것입니다 :

StatementAreaId
---------------
2
3
4
5
6

이 도움이되면 나무는 3의 깊이의 최대있다.

감사

해결법

  1. ==============================

    1.구조에 재귀 CTE :

    구조에 재귀 CTE :

    채우기 샘플 테이블을 만들고 : (우리에게 당신의 미래의 질문에이 단계를 저장하십시오)

    DECLARE @T AS TABLE
    (
        StatementAreaId int,
        ParentStatementAreaId int, 
        SubjectId int,
        Description varchar(20)
    )
    
    INSERT INTO @T VALUES
    (1               , 0                     , 100       , 'Reading'),
    (2               , 0                     , 110       , 'Maths'),
    (3               , 2                     , 0         , 'Number'),
    (4               , 2                     , 0         , 'Shape'),
    (5               , 3                     , 0         , 'Addition'),
    (6               , 3                     , 0         , 'Subtraction')
    

    질문:

    ;WITH CTE AS 
    (
        SELECT StatementAreaId, ParentStatementAreaId
        FROM @T 
        WHERE SubjectId = 110
    
        UNION ALL
        SELECT t1.StatementAreaId, t1.ParentStatementAreaId
        FROM @T t1 
        INNER JOIN CTE ON t1.ParentStatementAreaId = CTE.StatementAreaId
    )
    
    SELECT StatementAreaId
    FROM CTE 
    

    결과 :

    StatementAreaId
    2
    3
    4
    5
    6
    
  2. from https://stackoverflow.com/questions/40631222/find-all-members-in-a-tree-structure by cc-by-sa and MIT license