복붙노트

[SQL] SQL Server는 자기가 가입 재귀

SQL

SQL Server는 자기가 가입 재귀

나는 다음과 같은 열에서와 같이 간단한 분류 테이블이 :

그래서 카테고리의 무한한 양이 카테고리의 자식이 될 수 있습니다. 예를 들어 다음과 같은 계층 구조 보자

내가 원하는 반환 범주 "비즈니스 노트북은"모든으로 열을 반환하는 간단한 쿼리에서 그것의 부모, 쉼표 구분 또는 뭔가 :

또는 다음 예를 살펴 :

해결법

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

    1.구조에 재귀 CTE ....

    구조에 재귀 CTE ....

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

    DECLARE @T as table
    (
        id int,
        name varchar(100),
        parent_id int
    )
    
    INSERT INTO @T VALUES
    (1, 'A', NULL),
    (2, 'A.1', 1),
    (3, 'A.2', 1),
    (4, 'A.1.1', 2),
    (5, 'B', NULL),
    (6, 'B.1', 5),
    (7, 'B.1.1', 6),
    (8, 'B.2', 5),
    (9, 'A.1.1.1', 4),
    (10, 'A.1.1.2', 4)
    

    열팽창 계수 :

    ;WITH CTE AS
    (
        SELECT id, name, name as path, parent_id
        FROM @T 
        WHERE parent_id IS NULL
        UNION ALL
        SELECT t.id, t.name, cast(cte.path +','+ t.name as varchar(100)), t.parent_id
        FROM @T t
        INNER JOIN CTE ON t.parent_id = CTE.id
    )
    

    쿼리 :

    SELECT id, name, path
    FROM CTE
    

    결과 :

    id      name        path
    1       A           A
    5       B           B
    6       B.1         B,B.1
    8       B.2         B,B.2
    7       B.1.1       B,B.1,B.1.1
    2       A.1         A,A.1
    3       A.2         A,A.2
    4       A.1.1       A,A.1,A.1.1
    9       A.1.1.1     A,A.1,A.1.1,A.1.1.1
    10      A.1.1.2     A,A.1,A.1.1,A.1.1.2
    

    rextester에 온라인 데모를 참조하십시오

  2. from https://stackoverflow.com/questions/42955335/sql-server-recursive-self-join by cc-by-sa and MIT license