Redshift SQL实现两表按主键匹配的去重数据同步更新
Redshift 两张表按联合主键同步的SQL实现
你之前写的伪代码存在逻辑缺陷:通过内连查询只会返回两表主键匹配的base表数据,直接执行插入会触发(plan, date)联合主键的重复约束报错,既没有实现匹配行的percentage字段覆盖更新,也没有处理base表中主键不匹配的新行插入。
方案1:MERGE语法(推荐,性能最优)
Redshift原生支持MERGE语句专门处理"存在即更新、不存在即插入"的同步场景,单条语句即可完成逻辑,执行效率更高:
MERGE INTO final_table f USING base_table b ON f.plan = b.plan AND f.date = b.date -- 主键匹配时,用base表的percentage新值覆盖旧值 WHEN MATCHED THEN UPDATE SET percentage = b.percentage -- 主键不匹配时,直接插入新行 WHEN NOT MATCHED THEN INSERT (plan, date, percentage) VALUES (b.plan, b.date, b.percentage);
方案2:事务包裹更新+插入(兼容低版本Redshift)
如果你的集群版本暂不支持MERGE语法,可以通过显式事务包裹两步操作,保证数据一致性:
BEGIN TRANSACTION; -- 第一步:更新主键匹配的已有记录 UPDATE final_table f SET percentage = b.percentage FROM base_table b WHERE f.plan = b.plan AND f.date = b.date; -- 第二步:插入主键不存在的新增记录 INSERT INTO final_table (plan, date, percentage) SELECT b.plan, b.date, b.percentage FROM base_table b LEFT JOIN final_table f ON b.plan = f.plan AND b.date = f.date WHERE f.plan IS NULL; COMMIT TRANSACTION;
执行前请确认final表的
(plan, date)联合主键约束已正常生效,避免重复数据写入;如果表中还有其他同名字段,只需在UPDATE和INSERT子句中补充对应字段的赋值逻辑即可。
内容的提问来源于stack exchange,提问作者Sandhya PG
相关产品推荐
相关产品推荐

