Lev*_*kon 3 sql t-sql sql-server
我正忙着搞清楚我需要的SQL查询.
我有一个项目,为用户提供工作室级用户角色,每个项目都有项目级角色,覆盖/覆盖工作室级角色.所有角色都在工作室级别定义,但在项目级别仅定义了一些角色(主要是具有与其对应的工作室级别角色不同的值的角色)
g_studio_UsersInRole
userId roleId value
1 1 TRUE
1 2 TRUE
1 3 TRUE
2 1 FALSE
Run Code Online (Sandbox Code Playgroud)
g_project_UsersInRole
userId roleId value projectId
1 2 FALSE 1
2 1 TRUE 1
Run Code Online (Sandbox Code Playgroud)
我需要一个查询,它将项目角色覆盖在给定项目ID的工作室角色上.棘手的部分是避免重复的工作室级角色.我需要项目级角色(如果有的话)来支配.
我一直在玩Unions,但我无法弄清楚如何避免重复.
基本上我需要以下结果:
userId roleId value
1 1 TRUE
1 2 FALSE
1 3 TRUE
2 1 TRUE
Run Code Online (Sandbox Code Playgroud)
哪里
如项目层面所示
我以为我接近这个查询,但重复仍然存在:
;With roles As
(
SELECT UserId, Value, RoleId
FROM dbo.g_project_UsersInRole
WHERE (ProjectId = 1)
UNION
SELECT UserId, Value, RoleId
FROM dbo.g_studio_UsersInRole)
SELECT roles.RoleId, Value, UserId
FROM roles
RIGHT JOIN (SELECT DISTINCT RoleId FROM roles) AS distinctRoles
ON distinctRoles.RoleId = roles.RoleId
Run Code Online (Sandbox Code Playgroud)
你不需要工会.只需从工作室左侧加入项目,然后使用合并
下列
WITH g_studio_UsersInRole AS --Sampledata
(
SELECT 1 userId ,1 roleId , 'TRUE' value
UNION SELECT 1, 2, 'TRUE'
UNION SELECT 1, 3, 'TRUE'
UNION SELECT 2, 1, 'FALSE')
, g_project_UsersInRole as --Sampledata
(
SELECT 1 userId , 2 roleId , 'FALSE' value , 1 projectId
UNION SELECT 2, 1, 'TRUE', 1
)
SELECT
sRole.userId,
sRole.roleId,
COALESCE(pRole.Value,sRole.value) as value
FROM
g_studio_UsersInRole sRole
LEFT JOIN g_project_UsersInRole pRole
ON sRole.userId = pRole.userId
and sRole.roleId = pRole.roleId
and pRole.ProjectId = 1
Run Code Online (Sandbox Code Playgroud)
返回以下结果
userId roleId value
----------- ----------- -----
1 1 TRUE
1 2 FALSE
1 3 TRUE
2 1 TRUE
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7478 次 |
| 最近记录: |