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

階層テーブル内のアイテムのすべての親を区切り文字列 SQL として一覧表示する

    これはトリックを行うようです。重要なのは、パスを逆方向に構築し、親を見つける必要がなくなったら停止できることを理解することです:

    DECLARE @t table (ID int not null, Name varchar(19) not null, ParentID int null)
    insert into @t(ID,Name,ParentID) values
    (1 ,'Alex',null),
    (2 ,'John',null),
    (3 ,'Don',1),
    (4 ,'Philip',2),
    (5 ,'Shiva',2),
    (6 ,'San',3),
    (7 ,'Antony',6),
    (8 ,'Mathew',2),
    (9 ,'Cyril',8),
    (10,'Johan',9)
    
    declare @search table (ID int not null)
    insert into @search (ID) values (7),(10)
    
    ;With Paths as (
        select s.ID as RootID,t.ID,t.ParentID,t.Name, CONVERT(varchar(max),t.Name) as Path
        from
            @search s
                inner join
            @t t
                on
                    s.ID = t.ID
        union all
        select p.RootID,t.ID,t.ParentID,p.Name, t.Name + '->' + p.Path
        from Paths p
                inner join
            @t t
                on
                    p.ParentID = t.ID
    )
    select * from Paths where ParentID is null
    

    結果:

    RootID      ID          ParentID    Name                Path
    ----------- ----------- ----------- ------------------- ----------------------------
    10          2           NULL        Johan               John->Mathew->Cyril->Johan
    7           1           NULL        Antony              Alex->Don->San->Antony
    

    (最終的な状態を示すのに役立つ追加の列を残しました。フィルタリングせずに CTE をクエリすることも有益な場合があります)

    また、可能であれば区切り文字列を通常は使用しないことにも注意してください。 複数の値を扱うため。



    1. 複数のデータベースにわたるトランザクションを管理する方法

    2. Oracleのsidとデータベース名を確認しています

    3. SSHTunnelForwarderを使用してSSH経由でMySQLデータベースに接続する

    4. OracleCASEの短絡がgroupbyで機能しない