복붙노트

[SQL] 나무 테이블에 대한 SQL 쿼리

SQL

나무 테이블에 대한 SQL 쿼리

나는 트리 구조의 테이블이 있습니다 :

id parentId name
----------------
1  0        Category1
2  0        Category2
3  1        Category3
4  2        Category4
5  1        Category5
6  2        Category6
7  3        Category7

SQL 쿼리 결과에서 나는 테이블 등이 필요합니다 :

id parentId level name
----------------------
1  0        0     Category1
3  1        1     Category3
7  3        2     Category7
5  1        1     Category5
2  0        0     Category2
4  2        1     Category4
6  2        1     Category6

누가 쓰기 MS-SQL 쿼리에 나를 도울 수 있습니까? 감사!

해결법

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

    1.a_horse_with_no_name의 대답에 확장, ROW_NUMBER와 함께 재귀 CTE의 SQL 서버의 구현을 (재귀 단일 레코드 크로스 적용)를 사용하는 방법이 쇼 ()는 문제의 정확한 출력을 생성합니다.

    a_horse_with_no_name의 대답에 확장, ROW_NUMBER와 함께 재귀 CTE의 SQL 서버의 구현을 (재귀 단일 레코드 크로스 적용)를 사용하는 방법이 쇼 ()는 문제의 정확한 출력을 생성합니다.

    declare @t table(id int,parentId int,name varchar(20))
    insert @t select 1,  0        ,'Category1'
    insert @t select 2,  0,        'Category2'
    insert @t select 3,  1,        'Category3'
    insert @t select 4 , 2,        'Category4'
    insert @t select 5 , 1,        'Category5'
    insert @t select 6 , 2,        'Category6'
    insert @t select 7 , 3,        'Category7'
    ;
    
    WITH tree (id, parentid, level, name, rn) as 
    (
       SELECT id, parentid, 0 as level, name,
           convert(varchar(max),right(row_number() over (order by id),10)) rn
       FROM @t
       WHERE parentid = 0
    
       UNION ALL
    
       SELECT c2.id, c2.parentid, tree.level + 1, c2.name,
           rn + '/' + convert(varchar(max),right(row_number() over (order by tree.id),10))
       FROM @t c2 
         INNER JOIN tree ON tree.id = c2.parentid
    )
    SELECT *
    FROM tree
    order by RN
    

    우리는 id로 직접 주문하고 있기 때문에 트리 "경로"를 생산하기 위해 ID를 자신을 사용하여, 솔직히 말해서, 작동합니다,하지만 난이 ROW_NUMBER () 함수에서 빠져 줄 알았는데.

  2. ==============================

    2.

    WITH tree (id, parentid, level, name) as 
    (
       SELECT id, parentid, 0 as level, name
       FROM your_table
       WHERE parentid = 0
    
       UNION ALL
    
       SELECT c2.id, c2.parentid, tree.level + 1, c2.name
       FROM your_table c2 
         INNER JOIN tree ON tree.id = c2.parentid
    )
    SELECT *
    FROM tree;
    

    그래서 오타 (구문 오류)에있을 수 있습니다, 그것을 테스트하기 위해 손에 현재없는 SQL 서버가있다

  3. from https://stackoverflow.com/questions/5522478/sql-query-for-tree-table by cc-by-sa and MIT license