查询比较角色权限

问题描述 投票:0回答:1

我有下表(简化格式):

元素表

| elementId   int         |
| elementDesc VARCHAR(100)|

角色表

| roleId int            |
| roleName VARCHAR(100) |

元素角色表

| elementId  int     |
| roleId int         |
| permission CHAR(1) |

数据示例:

元素

[1, 'Save'] ,  [2, 'Sale'],  [3, 'Search']

角色表

[1, 'Admin'] , [2, 'User'] , [3, 'View Only']

角色元素

[1,1,'A'] ,    [2,1,'A'],    [3,1,'A'],     [1, 2, 'A'],   [3,2,'A'] 

如您所见,角色 1 Admin 在 RoleElement 表中拥有所有元素的权限,而用户角色仅拥有 3 个元素中的 2 个元素的权限,并且仅查看角色根本没有权限记录。

我的要求是返回一个结果来比较所有角色与元素,如下:

Element, Admin, User, View Only
-------------------------------------
1    ,   A      ,  A   ,          
2    ,   A      ,      ,   
3    ,   A      ,  A   ,          

因此,对于每个元素,他们希望查看每个角色的权限。 如果角色和元素之间没有权限记录,他们仍然希望看到它是空白的。 (就像仅查看角色的情况一样) 目的是能够比较角色之间的所有权限。

我尝试了很多方法使用左连接或内表对表进行分组,但我不知道如何获取列中的角色,特别是当 RoleElement 表中没有记录时。 有很多角色和元素,很难为每个角色和元素运行并复制/粘贴到电子表格中。

数据库是DB2,但是如果解决方案不是DB2 sql,也还是可以的。我可以尝试在 DB2 中找到与它等效的内容。

sql db2 grouping
1个回答
0
投票
SELECT
    e.elementId AS Element,
    MAX(CASE WHEN re.roleId = 1 THEN re.permission ELSE NULL END) AS Admin,
    MAX(CASE WHEN re.roleId = 2 THEN re.permission ELSE NULL END) AS "User",
    MAX(CASE WHEN re.roleId = 3 THEN re.permission ELSE NULL END) AS "View Only"
FROM
    Element e
LEFT JOIN
    RoleElement re ON e.elementId = re.elementId
GROUP BY
    e.elementId
ORDER BY
    e.elementId;

演示:https://dbfiddle.uk/GksA1fTm

© www.soinside.com 2019 - 2024. All rights reserved.