gpt4 book ai didi

sql - 在 SQL 中展平组成员树(使用循环引用)

转载 作者:行者123 更新时间:2023-12-04 16:01:31 25 4
gpt4 key购买 nike

我正在处理一张 table 。

GroupMembers (GroupName, MemberName)

每个组成员都有一行,一个组可以包含其他组和用户。

我想提取一个 GroupName、MemberName 对列表,其中 MemberName 只是一个用户列表。从本质上讲,将树弄平。我以前做过类似的事情,并手动编写查询,将每个级别的叶子导出到一个单独的表,然后在我达到最后一个级别后将其合并。

这棵树似乎是不平衡的,并且没有任何固定的级别数。我一直在研究递归查询的示例,但在实现它们方面运气不佳。

有没有人对我可以在哪里提出一个优雅的解决方案有什么好的建议?

非常感谢!

ps 如果有帮助,我正在使用 SQL Server 2008。

更新:我偶然发现了递归 CTE。我唯一的问题是数据中有循环引用:(。

这是我用于查询的代码:-

    WITH Members AS
(
--Init
SELECT GroupName, MemberName
FROM GroupMembers
WHERE MemberName NOT IN (Select GroupName from GroupMembers)
UNION ALL

--Recursive Exe
SELECT h.GroupName, h.MemberName
FROM GroupMembers h INNER JOIN Members m
ON h.MemberName = m.GroupName
)
Select * into GroupMembersFlattened from Members OPTION (MAXRECURSION 1500)

有没有办法在执行上述查询之前排除循环引用/清理数据?

谢谢!

示例循环/循环引用
循环引用的一个例子是数据包含以下内容:-
    GroupMember,     MemberName
Group1, Group2
Group1, User1
Group2, Group3
Group2, User2
Group3, Group1

谢谢米凯尔的提示!

最佳答案

这就是您排除循环的方式

WITH Members AS
(
--Anchor
SELECT
GroupName,
MemberName,
0 As isCycle,
'.' + CAST(MemberName As varchar(max)) + '.' As [path]
FROM GroupMembers
WHERE
MemberName NOT IN (Select GroupName from GroupMembers)

UNION ALL

--Recursive call
SELECT
h.GroupName,
h.MemberName,
CASE WHEN m.[path] like '%.' + CAST(h.MemberName as varchar(max)) + '.%' THEN 1 ELSE 0 END As isCycle,
m.[path] + CAST(h.MemberName as varchar(max)) + '.' As [path]
FROM GroupMembers h
JOIN Members m
ON h.MemberName = m.GroupName
WHERE
m.isCycle = 0
)
SELECT
*
FROM
Members
WHERE
Members.isCycle = 0

关于sql - 在 SQL 中展平组成员树(使用循环引用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6224564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com