MySQL多表更新问题:如何用三表total_revenue平均值更新Y2018字段
解决Y2018表5Y_growth_total_revenue字段更新问题
你的UPDATE语句没生效的核心问题是多表JOIN的连接条件写法错误——MySQL不支持y7.id_azione = y8.id_azione = y6.id_azione这种连续等式的写法,得用分开的ON子句来明确每一对表的关联关系。
给你两种可行的修正方案:
方案1:仅更新三张表都有对应id的记录(INNER JOIN)
如果你的业务逻辑是只有当id_azione在三张表中都存在时才更新平均值,用这个写法:
UPDATE Y2018 y8 INNER JOIN Y2017 y7 ON y7.id_azione = y8.id_azione INNER JOIN Y2016 y6 ON y6.id_azione = y8.id_azione SET y8.5Y_growth_total_revenue = (y8.total_revenue + y7.total_revenue + y6.total_revenue) / 3;
这里把Y2017与Y2018、Y2016与Y2018的关联条件分开写,数据库就能正确匹配同id的记录了。
方案2:处理缺失记录的情况(LEFT JOIN + COALESCE)
如果有些id_azione可能在某张表中不存在,你希望用0代替缺失的total_revenue来计算平均值,就用这个写法:
UPDATE Y2018 y8 LEFT JOIN Y2017 y7 ON y7.id_azione = y8.id_azione LEFT JOIN Y2016 y6 ON y6.id_azione = y8.id_azione SET y8.5Y_growth_total_revenue = ( COALESCE(y8.total_revenue, 0) + COALESCE(y7.total_revenue, 0) + COALESCE(y6.total_revenue, 0) ) / 3;
COALESCE函数会把NULL值替换成0,避免因为某张表无对应记录导致平均值变成NULL。
额外检查建议
在执行UPDATE前,建议先跑个SELECT验证关联和计算是否正确,避免误操作:
SELECT y8.id_azione, (y8.total_revenue + y7.total_revenue + y6.total_revenue) / 3 AS avg_revenue FROM Y2018 y8 INNER JOIN Y2017 y7 ON y7.id_azione = y8.id_azione INNER JOIN Y2016 y6 ON y6.id_azione = y8.id_azione LIMIT 10;
另外还要确认:
id_azione字段在三张表中的数据类型一致,没有拼写错误5Y_growth_total_revenue是数值型字段(比如DECIMAL、FLOAT),能存储计算后的平均值
内容的提问来源于stack exchange,提问作者carlolab
相关产品推荐
相关产品推荐

