2

階層 (隣接モデル) SQL Server テーブルについて質問があります。このリンクGet child records on one columnは、親フィールドにすべての子レコードの連結リストを設定する方法を示しています。したがって、テーブルの「子供」列は次のようになります。

ID ParentID Name   Children
1  NULL     Root   2,3
2  1        L2-1   4
3  1        L2-3   NULL
4  2        L3-4   6
5  3        L3-5   NULL
6  4        L4-6   NULL

直接の子供だけでなく、複数のレベル、つまりすべての子孫に対してこれを行う方法を教えてもらえますか?

つまり、テーブルを次のようにしたいと思います。

ID ParentID Name   Children
1  NULL     Root   2,3,4,5,6
2  1        L2-1   4,6
3  1        L2-3   5
4  2        L3-4   6
5  3        L3-5   NULL
6  4        L4-6   NULL

ありがとう!

4

1 に答える 1

3

以下のクエリを使用できます。あなたのテーブル名はChildrenだと思いました。

最初に、親のリストを一番上まで作成します (最初のクエリ)。次に、すべての個別のブランチをまとめます (2 番目のクエリ)。

WITH temp (ID, ParentID, ChildrenChain)
AS
(
    SELECT ID, ParentID, CAST('' AS VARCHAR(100))
    FROM children
    WHERE NOT EXISTS (SELECT * FROM children cc WHERE cc.ParentID = children.ID)

    UNION ALL

    SELECT children.ID, children.ParentID, CAST((temp.ChildrenChain + ',' + CAST(temp.ID AS VARCHAR(100))) AS VARCHAR(100)) 
    FROM children
    INNER JOIN temp ON children.ID = temp.ParentID
)

SELECT DISTINCT ID,
    REPLACE(
        STUFF(
           (SELECT
                ',' + t2.ChildrenChain
                FROM temp t2
                WHERE temp.ID=t2.ID
                ORDER BY t2.ChildrenChain
                FOR XML PATH(''), TYPE
           ).value('.','varchar(max)')
           ,1,2, ''
        ), 
    ',,', ',') AS ChildValues
FROM temp
WHERE LEN(ChildrenChain) > 0

それがうまくいかない場合はお知らせください。

于 2013-09-24T01:49:19.340 に答える