SQL分层结构
有一个如下结构的表和数据:
通过SQL CTE递归可以得到如下的结构:
但在Acess Groups列,我想要到得到下面的结果:
即:在得到下一阶的Groups时,需要判断子阶的Groups是否在父级,如果不在,子阶就不需要,求大神帮助写一个SQL Stored Procedures or SQL Function解决,谢谢谢谢谢谢。
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可以帮到你。