如何通过行结构表B更新列结构表A的对应分类金额数据?
核心实现思路
你需要先把表B的行式存储的分类数据转为和表A对应的列式结构,再关联表A执行更新操作,两种常用实现方案如下:
方案1:行转列后批量更新(适合分类数量较少场景)
先通过条件聚合把表B转为宽表结构,再一次性关联更新表A所有分类列,以MySQL语法为例:
UPDATE 表A a INNER JOIN ( SELECT B_Policy, MAX(CASE WHEN Category = 1 THEN Value END) AS val_1, MAX(CASE WHEN Category = 2 THEN Value END) AS val_2, MAX(CASE WHEN Category = 3 THEN Value END) AS val_3 -- 有更多分类按相同规则补充CASE语句即可 FROM 表B GROUP BY B_Policy ) b ON a.A_Policy = b.B_Policy SET a.`Value First Category` = COALESCE(b.val_1, a.`Value First Category`), a.`Value Second Category` = COALESCE(b.val_2, a.`Value Second Category`), a.`Value Third Category` = COALESCE(b.val_3, a.`Value Third Category`);
这里用COALESCE是为了避免表B没有对应分类值时把表A原有值清空,不需要可以去掉。
方案2:单分类逐次更新(适合分类多/仅需更新少量分类场景)
不需要做行转列,按分类单独写更新语句即可,逻辑更简单不易出错:
-- 更新分类1对应列 UPDATE 表A a INNER JOIN 表B b ON a.A_Policy = b.B_Policy AND b.Category = 1 SET a.`Value First Category` = b.Value; -- 更新分类2对应列 UPDATE 表A a INNER JOIN 表B b ON a.A_Policy = b.B_Policy AND b.Category = 2 SET a.`Value Second Category` = b.Value; -- 其他分类按相同规则补充即可
注意事项
- 操作前务必先备份表A全量数据,或先执行SELECT关联查询验证匹配结果无误后再执行更新
- 可以给
A_Policy、B_Policy、Category字段添加索引,大幅提升大表下的关联更新效率 - 如果分类数量极多,可以通过动态SQL自动生成更新语句,无需手动编写全部分类逻辑
内容的提问来源于stack exchange,提问作者Nassim
相关产品推荐
相关产品推荐

