无敌逍遥生 2019-12-19 16:24 采纳率: 0%
浏览 98

SQL Stored Procedures 递归分层结构

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

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

图片说明

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

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

  • 写回答

1条回答 默认 最新

  • 憧憬blog 2023-03-15 05:05
    关注

    对于这个问题,我建议使用递归的方式来解决。具体的实现可以参考以下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可以帮到你。

    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料