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

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可以帮到你。

    评论

报告相同问题?

悬赏问题

  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 请求分析基于spring boot+vue的前后端分离的项目
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?