DB2无主键表删除重复行:保留唯一A、B对及最大TS行
DB2 删除重复行解决方案(保留A、B唯一+最新TS)
针对AIX上DB2 v11.1.4.6环境,以下方案可一次性清理重复行,满足每个A、B字段唯一,TS值不同时保留TS更大的行,TS相同时确保仅保留一行的需求,支持干跑验证和实际执行,且基于EXISTS子句实现,规避ROWID相关报错问题。
1. 干跑验证(查询待删除的重复行)
先执行以下语句确认要删除的行是否符合预期,避免误操作:
SELECT * FROM 你的表名 t1 WHERE EXISTS ( SELECT 1 FROM 你的表名 t2 WHERE t2.A = t1.A AND t2.B = t1.B AND ( t2.TS > t1.TS OR (t2.TS = t1.TS AND t2.ROWID > t1.ROWID) ) )
2. 实际执行(删除重复行)
确认干跑结果无误后,执行删除语句:
DELETE FROM 你的表名 t1 WHERE EXISTS ( SELECT 1 FROM 你的表名 t2 WHERE t2.A = t1.A AND t2.B = t1.B AND ( t2.TS > t1.TS OR (t2.TS = t1.TS AND t2.ROWID > t1.ROWID) ) )
方案说明
- 核心逻辑:对每一行
t1,如果存在同一A、B组合的行t2,要么TS值更大(说明t1是旧数据需删除),要么TS值相同但ROWID更大(说明t1是更早插入的重复行,保留t2) - 规避报错原因:通过表别名明确关联ROWID伪列,避免SQL0206N(列不存在)错误;无需使用MAX(ROWID)聚合,直接通过关联子句实现唯一行筛选
内容的提问来源于stack exchange,提问作者ikegami
相关产品推荐
相关产品推荐

