[英]Use SQL to Find Values Where its Many to One
我的问题的第一部分是不知道如何正确地提出和说明这个问题,因此,如果这是重复的,我深表歉意。
除了用户表,我还有一个这样的表
[UserRoles]
UserID | RoleName
-------|---------
1 | Role1
1 | Role2
1 | Role3
1 | Role4
2 | Role1
2 | Role4
另一个像这样的表:
[RoleRoleTypes]
RoleName | Function
-------------------
Role1 | FunctionA
Role2 | FunctionA
Role3 | FunctionB
Role4 | FunctionC
我要结束的是一个带有UserID
的表,一个逗号分隔的角色列表,一个逗号分隔的函数列表。
最终结果
UserId | Roles | Functions
-------|---------------------------- |------------------------------------
1 | Role1, Role2, Role3, Role4 | FunctionA, FunctionB, FunctionC
2 | Role1, Role4 | FunctionC
前两列非常简单,使用了东西来创建逗号分隔的角色列表。 但是鉴于多个角色组成一个函数,我不确定如何去计算函数列表。 用户必须具有列出的所有角色才能具有该功能。 因此,如果您具有角色1,但没有角色2,则没有FunctionA。 我尝试了各种联接,但从未找到接近正确数据的地方。 有什么建议吗?
这是我前两列的内容
SELECT u.email, Roles = STUFF(
(SELECT ',' + RoleName
From UserRoles ur
WHERE ur.UserID = u.UserID
FOR XML PATH('')), 1, 1, '')
FROM Users u
编辑添加了说明和最终结果示例
我猜你只需要使用类似的方法作为角色名的情况下,并使用distinct
,以避免重复功能
SELECT u.userid,
Roles = STUFF(
(SELECT ', ' + RoleName
FROM UserRoles ur
WHERE ur.UserID = u.UserID
FOR XML PATH('')
), 1, 1, ''),
Functions = STUFF(
(SELECT distinct ', ' + rt.[function]
FROM [UserRoles] ur
JOIN [RoleRoleTypes] rt ON ur.RoleName = rt.RoleName
WHERE ur.UserID = u.UserID
FOR XML PATH('')
), 1, 1, '')
FROM [User] u
您需要在查询中使用Distinct关键字,以避免结果重复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.