Db2 SQL:如何合并同一用户同表的多权限行(忽略Timestamp)
Db2合并AUTHTABLE中同一用户表的权限行
原表数据
| GRANTEE | TTNAME | INSERTALLOWED | DELETEALLOWED | UPDATEALLOWED | SELALLOWED | TIMESTAMP |
|---|---|---|---|---|---|---|
| USER1 | TABLE_A | Y | Y | Y | 2023-01-01 | |
| USER1 | TABLE_A | Y | 2023-01-02 |
期望结果
| GRANTEE | TTNAME | INSERTALLOWED | DELETEALLOWED | UPDATEALLOWED | SELALLOWED |
|---|---|---|---|---|---|
| USER1 | TABLE_A | Y | Y | Y | Y |
已尝试的失败方法
1. GROUP BY 语句
SELECT GRANTEE, TTNAME, INSERTALLOWED, DELETEALLOWED, UPDATEALLOWED, SELALLOWED FROM AUTHTABLE WHERE GRANTEE='USER1' AND TTNAME='TABLE_A' GROUP BY GRANTEE, TTNAME, INSERTALLOWED, DELETEALLOWED, UPDATEALLOWED, SELALLOWED;
问题:因每行权限列的组合不同,GROUP BY会将其视为不同分组,最终返回两行结果。
2. 自连接语句
SELECT A.GRANTEE, A.TTNAME, A.INSERTALLOWED, A.DELETEALLOWED, A.UPDATEALLOWED, A.SELALLOWED FROM AUTHTABLE AS A INNER JOIN AUTHTABLE AS B ON A.GRANTEE=B.GRANTEE AND A.TTNAME=B.TTNAME AND A.TIMESTAMP<=B.TIMESTAMP WHERE A.GRANTEE='USER1' AND A.TTNAME='TABLE_A';
问题:自连接仅关联行数据,未对权限列进行合并,仍返回多行结果。
解决方案
使用Db2的MAX()聚合函数,针对每个权限列提取非空的Y值——只要同一用户对某表的任意一行权限为Y,即代表拥有该权限。
针对指定用户和表的SQL
SELECT GRANTEE, TTNAME, MAX(INSERTALLOWED) AS INSERTALLOWED, MAX(DELETEALLOWED) AS DELETEALLOWED, MAX(UPDATEALLOWED) AS UPDATEALLOWED, MAX(SELALLOWED) AS SELALLOWED FROM AUTHTABLE WHERE GRANTEE='USER1' AND TTNAME='TABLE_A' GROUP BY GRANTEE, TTNAME;
处理所有用户和表的SQL
若需合并全表所有用户的权限数据,移除WHERE条件即可:
SELECT GRANTEE, TTNAME, MAX(INSERTALLOWED) AS INSERTALLOWED, MAX(DELETEALLOWED) AS DELETEALLOWED, MAX(UPDATEALLOWED) AS UPDATEALLOWED, MAX(SELALLOWED) AS SELALLOWED FROM AUTHTABLE GROUP BY GRANTEE, TTNAME;
原理说明
MAX()函数会自动忽略NULL值,在同一用户表的多行数据中,取权限列的最大非空值(此处仅存在Y和NULL,最终会返回有效的Y)。- GROUP BY仅按
GRANTEE和TTNAME分组,确保同一用户同一表的所有行被合并为一行,同时聚合出完整的权限信息。
内容的提问来源于stack exchange,提问作者dagl
相关产品推荐
相关产品推荐

