我很难搞清楚我需要的SQL查询。
我有一个项目,为用户提供工作室级用户角色,每个项目都有项目级角色,覆盖/覆盖工作室级角色。所有角色都在工作室级别定义,但只在项目级别定义了一些角色(主要是具有与其相应的工作室级别角色不同的值的角色)
g_studio_UsersInRole
userId roleId value
1 1 TRUE
1 2 TRUE
1 3 TRUE
2 1 FALSE
g_project_UsersInRole
userId roleId value projectId
1 2 FALSE 1
2 1 TRUE 1
我需要一个查询,将项目角色覆盖在给定项目ID的工作室角色上。棘手的部分是避免重复的工作室级角色。我需要项目级角色(如果有的话)来支配。
我一直在玩工会,但我无法弄清楚如何避免重复。
基本上我需要以下结果:
userId roleId value
1 1 TRUE
1 2 FALSE
1 3 TRUE
2 1 TRUE
哪里
如项目级别所示
我以为我接近这个查询,但重复项仍然存在:
;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
答案 0 :(得分:7)
你不需要工会。只需从工作室左侧加入项目,然后使用合并
以下
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
返回以下结果
userId roleId value
----------- ----------- -----
1 1 TRUE
1 2 FALSE
1 3 TRUE
2 1 TRUE