sql >> データベース >  >> RDS >> Sqlserver

ツリーテーブルのSQLクエリ

    a_horse_with_no_nameの答えを拡張して、SQL Serverの再帰CTEの実装を使用する方法を示します(再帰単一レコード相互適用 )row_number()と組み合わせて、質問の正確な出力を生成します。

    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 cast('/' + RN + '/' as hierarchyid)
    

    正直なところ、IDで直接順序付けしているため、ID自体を使用してツリーの「パス」を生成することはできますが、row_number()関数を挿入すると思いました。



    1. MySQLエラー::'ユーザー'root'@'localhost'のアクセスが拒否されました

    2. PostgreSQLでのAcosd()のしくみ

    3. SQL結合の究極のガイド:外部結合–パート2

    4. MySQLWorkbenchを使用して新しいデータベース図を作成する方法