【问题标题】:SQL Server - Concatenate all child IDs into delimited string in parent recordSQL Server - 将所有子 ID 连接到父记录中的分隔字符串
【发布时间】:2013-09-23 10:20:07
【问题描述】:

我有一个关于分层(邻接模型)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

谢谢!

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    您可以使用下面的查询。我假设你的表名是 Children。

    它首先建立一个父级列表直到顶部(第一个查询)。然后它将所有单独的分支放在一起(第二个查询)。

    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
    

    如果这对你不起作用,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多