MySQL如何基于另一表字段值按条件更新zeus表的Total列
错误原因
- 子查询缺失
FROM ares声明,数据库无法定位取值来源表 - 逻辑硬编码仅支持
May月份,无法实现全月份自动关联匹配 - 未绑定两表的关联关系,多月份数据场景下会出现取值混乱
正确实现
MySQL支持UPDATE JOIN语法完成关联更新,比嵌套子查询效率更高、逻辑更清晰。
全量更新所有月份数据
UPDATE zeus z INNER JOIN ares a ON z.Month = a.Month SET z.Total = CASE WHEN z.Items LIKE 'A%' THEN z.Ratio * a.`Value A` WHEN z.Items LIKE 'B%' THEN z.Ratio * a.`Value B` ELSE z.Total -- 非A/B开头的Items保留原有Total值 END;
仅更新5月(May)数据
如果只需要更新指定月份,在末尾加过滤条件即可:
UPDATE zeus z INNER JOIN ares a ON z.Month = a.Month SET z.Total = CASE WHEN z.Items LIKE 'A%' THEN z.Ratio * a.`Value A` WHEN z.Items LIKE 'B%' THEN z.Ratio * a.`Value B` ELSE z.Total END WHERE z.Month = 'May';
注意事项
如果存在zeus的月份在ares中无匹配数据的场景,又需要保留zeus原有Total值,可以将INNER JOIN改为LEFT JOIN,同时新增空值判断逻辑:
UPDATE zeus z LEFT JOIN ares a ON z.Month = a.Month SET z.Total = CASE WHEN a.id IS NULL THEN z.Total -- 无匹配数据保留原值 WHEN z.Items LIKE 'A%' THEN z.Ratio * a.`Value A` WHEN z.Items LIKE 'B%' THEN z.Ratio * a.`Value B` ELSE z.Total END;
内容的提问来源于stack exchange,提问作者daniel ajj
相关产品推荐
相关产品推荐

