我很难找出我需要的 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 的工作室角色。棘手的部分是避免重复工作室级别的角色。我需要项目级角色(如果有的话)来主导。
我一直在玩 Unions,但我不知道如何避免重复。
基本上我需要以下结果:
userId roleId value
1 1 TRUE
1 2 FALSE
1 3 TRUE
2 1 TRUE
在哪里
- userId 为 1,roleId 为 2 的值为 False
- userId 为 2,roleId 为 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
最佳答案
你不需要工会。只需左连接到工作室的项目,然后使用合并
以下
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
关于一列的 SQL Server 不同联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7338884/