繁体   English   中英

使用SQL在多对一的位置查找值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM