sql - 是否可以从一个表中使用 CASE 语句列出所有可能的用户角色? [寺数据]

标签 sql database teradata

enter image description here

我正在弄清楚是否可以列出用户需要具有的所有 4 个角色,并为每个角色声明"is"或“否”。例如。

SELECT DISTINCT Grantee, GranteeKind, RoleName, WhenGranted,
    CASE
        WHEN RoleName='Manager' THEN 'Yes'
        WHEN RoleName='Assistant' THEN 'Yes'
        WHEN RoleName='Executive' THEN 'Yes'
        WHEN RoleName='Deputy' THEN 'Yes'
                    ELSE NULL
            END AS "Already granted?"
    FROM DBC.RolesM
    WHERE Grantee='UserName' 
    AND RoleName IN
    ('Manager',
    'Assistant',
    'Executive',
    'Deputy');

我的查询获取了以下结果,它是 100% 正确的。

Grantee    GranteeKind  RoleName    WhenGranted Already Granted? 
UserName    User    Manager         2018-01-30        Yes
UserName    User    Assistant       2016-01-30        Yes

不过,我想知道是否有可能得到这样的东西,以便我们对未分配的角色有明确的答案。

Grantee    GranteeKind  RoleName    WhenGranted Already Granted? 
UserName    User    Manager         2018-01-30        Yes
UserName    User    Assistant       2016-01-30        Yes
UserName    User    Executive       2016-01-30        No
UserName    User    Deputy          2016-01-30        No

最佳答案

使用交叉连接生成行,然后使用左连接引入值。

不幸的是,Teradata 使得生成角色列表有点困难,但这应该可行:

select g.Grantee, g.GranteeKind, r.RoleName, 
       rm.WhenGranted,
       (case when rm.RoleName is not null then 'Yes' else 'No' end) as already_granted
from (select distinct grantee, GranteeKind
      from DBC.RolesM
     ) g cross join
     (select distinct RoleName
      from DBC.RolesM
      where RoleName in ('Manager', 'Assistant', 'Executive', 'Deputy')
     ) r left join
     DBC.RolesM rm
     on rm.grantee = g.grantee and rm.rolename = r.rolename

关于sql - 是否可以从一个表中使用 CASE 语句列出所有可能的用户角色? [寺数据],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56110180/

相关文章:

mysql - Jenkins - 来自 MySQL 查询的主动选择

sql - 在 Teradata SQL 中添加总计百分比列

MYSQL - 如何分组并取非空值

sql - Postgres 数据库如果不存在则创建

sql - 为什么在同一个查询中一个表会被别名两次?

php - MySql 如何插入或更新 IF 重复的 2 个字段?

sql - 比较表中的 3 个连续行

apache-spark - 如何使用DataFrame和JDBC连接为缓慢的Spark作业提高性能?

sql - 我只需要 Min

mysql - 为什么 FOUND_ROWS() 对于 5.7.17 SQL 版本返回错误结果?