一列的 SQL Server 不同联合

标签 sql sql-server tsql

我很难找出我需要的 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/

相关文章:

php - Cs购物车产品查询很慢

sql - 合并和缩短两个 where 子句条件

sql - 如何使用生成多行的 select 语句更新表?

mysql - 创建索引优化慢查询

mysql - 需要从 MySQL 中获取行

node.js - 如何解析 Node.js mssql promise

c# - 确定哪些 SQL 数据类型需要引用值?

sql - 返回受 SQL 事务影响的总行数

php - 如何进行简单的 "OR"查询?

c# - SQLite .NET 插入 ExecuteNonQuery 返回 1