Я с трудом разбираюсь с запросом 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
Мне нужен запрос, который перекрывает роли проекта над ролями студии для данного идентификатора проекта. Самое сложное - избежать дублирования роли на уровне студии. Мне нужны роли уровня проекта (если есть), чтобы доминировать.
Я играл с Союзами, но не могу понять, как избежать дубликатов.
В основном мне нужны следующие результаты:
userId roleId value
1 1 TRUE
1 2 FALSE
1 3 TRUE
2 1 TRUE
Где
- userId of 1, roleId of 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