sql - SQL Server:使用递归 CTE 解决组成员身份
问题描述
我有一张桌子 ( users_groups
) :
+-----------+------------+---------+
| groupGUID | memberGUID | isGroup |
+-----------+------------+---------+
| 32AB160C | 5B277276 | 0 |
| 32AB160C | 0A023D1D | 0 |
| 5C952B2E | 32AB160C | 1 |
| 4444FTG5 | 5C952B2E | 1 |
+-----------+------------+---------+
isGroup
列指示是否memberGUID
是组。
我想获得一个new_users_groups
解决所有组成员身份的新表():
+-----------+------------+
| groupGUID | memberGUID |
+-----------+------------+
| 32AB160C | 5B277276 |
| 32AB160C | 0A023D1D |
| 5C952B2E | 5B277276 |
| 5C952B2E | 0A023D1D |
| 4444FTG5 | 5B277276 |
| 4444FTG5 | 0A023D1D |
+-----------+------------+
现在,我正在手动完成所有操作:
寻找所有组的成员GUID
SELECT * FROM users_groups WHERE isGroup = 1;
对于上一步返回的所有组,找到其成员
SELECT * FROM users_groups WHERE groupGUID = '5C952B2E'
如果成员不是组,则将它们插入到新表中
INSERT INTO new_users_groups (groupGUID, memberGUID) VALUES ('5C952B2E', '5B277276'); INSERT INTO new_users_groups (groupGUID, memberGUID) VALUES ('5C952B2E', '0A023D1D');
如果成员是组,请转到步骤 2。
我怎样才能自动化呢?也许使用递归 CTE ?
解决方案
您可以使用递归 CTE 执行此操作:
with cte as (
select ug.groupGUID, ug.groupGUID as grp, ug.memberGUID
from user_groups ug
where isGroup = 0
union all
select ug.groupGUID, ug.groupGUID as grp, cte.memberGUID
from user_groups ug join
cte
on cte.grp = ug.memberGUID
)
select groupGUID, memberGUID
from cte;
这是一个Rextester。
推荐阅读
- vb.net - 在通用 VB.NET 结构中,如何访问其显式提供的构造函数?
- python-3.x - 如何将 creationflags=CREATE_NO_WINDOW 与 subprocess.run 一起使用?
- sql - Excel VBA 连接到带有参数的 SQL 存储过程
- html - 如何将组件展开到页面底部并使其最终可滚动?
- sql-server - 使用格式文件和 dat 文件批量插入
- bash - 通过命令行检查 BitBucket 存储库是否存在
- spring-boot - 带有 Rest 请求和 Thymeleaf 的 Springboot 语言环境
- powershell - 从其他文件导入和导出类
- wordpress - 如何向 WooCommerce 添加默认计费标题?
- haproxy - 添加从查询参数中获取的标题