SQL 服务器:使用递归 CTE 解析组成员资格
SQL Server : Using recursive CTE to resolve group membership
我有一个 table (users_groups
) :
+-----------+------------+---------+
| groupGUID | memberGUID | isGroup |
+-----------+------------+---------+
| 32AB160C | 5B277276 | 0 |
| 32AB160C | 0A023D1D | 0 |
| 5C952B2E | 32AB160C | 1 |
| 4444FTG5 | 5C952B2E | 1 |
+-----------+------------+---------+
isGroup
列表示memberGUID
是否为一个组。
我想获得一个新的 table (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'
如果成员不是群组,将他们插入到新的 table
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.
尝试CROSS JOIN
SELECT t1.groupGUID, t2.memberGUID
FROM temp t1, temp t2 WHERE t2.isGroup = 0
GROUP BY t1.groupGUID, t2.memberGUID
我有一个 table (users_groups
) :
+-----------+------------+---------+
| groupGUID | memberGUID | isGroup |
+-----------+------------+---------+
| 32AB160C | 5B277276 | 0 |
| 32AB160C | 0A023D1D | 0 |
| 5C952B2E | 32AB160C | 1 |
| 4444FTG5 | 5C952B2E | 1 |
+-----------+------------+---------+
isGroup
列表示memberGUID
是否为一个组。
我想获得一个新的 table (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'
如果成员不是群组,将他们插入到新的 table
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.
尝试CROSS JOIN
SELECT t1.groupGUID, t2.memberGUID
FROM temp t1, temp t2 WHERE t2.isGroup = 0
GROUP BY t1.groupGUID, t2.memberGUID