SQL Stored Procedures 递归分层结构

SQL分层结构
有一个如下结构的表和数据:
图片说明

通过SQL CTE递归可以得到如下的结构:

图片说明

但在Acess Groups列,我想要到得到下面的结果:
图片说明

即:在得到下一阶的Groups时,需要判断子阶的Groups是否在父级,如果不在,子阶就不需要,求大神帮助写一个SQL Stored Procedures or SQL Function解决,谢谢谢谢谢谢。

对于这个问题,我建议使用递归的方式来解决。具体的实现可以参考以下SQL Stored Procedure代码:

CREATE PROCEDURE GetHierarchicalGroups
    @ParentGroupId INT
AS
BEGIN
    WITH GroupHierarchy AS (
        SELECT Id, Name, ParentId, CAST(Name AS NVARCHAR(MAX)) AS AllGroups
        FROM Groups
        WHERE ParentId = @ParentGroupId
        
        UNION ALL
        
        SELECT g.Id, g.Name, g.ParentId, CAST(gh.AllGroups + '\'' + g.Name AS NVARCHAR(MAX))
        FROM Groups g
        JOIN GroupHierarchy gh ON g.ParentId = gh.Id
        WHERE CHARINDEX('\'+CAST(g.Name AS NVARCHAR(MAX))+'\',
                         '\'+CAST(gh.AllGroups AS NVARCHAR(MAX))+'\') = 0
    )
    
    SELECT gh.Id, gh.Name, gh.AllGroups
    FROM GroupHierarchy gh
    ORDER BY gh.AllGroups
END

注意,在这个存储过程中,我们使用了CTE递归来获取所有的子节点,然后通过使用CHARINDEX函数来判断子节点是否在父节点中。如果子节点在父节点中,那么就将其添加到结果集中。如果不在,那么就忽略该节点并继续检查下一节点。最后,输出结果集并按照AllGroups列进行排序。

希望这个SQL Stored Procedure可以帮到你。