我花了点时间弄清楚我需要的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的项目角色覆盖在工作室角色上。棘手的部分是避免重复的工作室级别角色。我需要项目级别的角色(如果有)来主导。
我一直在和Union一起玩,但是我不知道如何避免重复。
基本上我需要以下结果:
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
您不需要工会。只需离开工作室即可加入项目,然后使用合并
以下
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