我有下表(简化格式):
元素表
| 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 中找到与它等效的内容。
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;