You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Db2 SQL:如何合并同一用户同表的多权限行(忽略Timestamp)

Db2合并AUTHTABLE中同一用户表的权限行

原表数据

GRANTEETTNAMEINSERTALLOWEDDELETEALLOWEDUPDATEALLOWEDSELALLOWEDTIMESTAMP
USER1TABLE_AYYY2023-01-01
USER1TABLE_AY2023-01-02

期望结果

GRANTEETTNAMEINSERTALLOWEDDELETEALLOWEDUPDATEALLOWEDSELALLOWED
USER1TABLE_AYYYY

已尝试的失败方法

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 11:17:08