SQL统计重复行更新列时子查询别名DailyPointing报错1054如何解决
问题根因
你的SQL写法存在两个核心错误:
- 语法层面:SQL执行顺序中,子查询内定义的别名无法直接在外层UPDATE的SET子句中引用,同时你将
in子句直接放在除法运算符后的写法完全不符合SQL语法规则。 - 逻辑层面:原UPDATE语句没有和统计重复次数的子查询做字段关联,系统无法匹配每一行对应的重复次数值,自然会提示
DailyPointing字段不存在。
正确写法(适配MySQL环境,对应报错码1054为MySQL原生报错)
使用多表关联更新的方式,先关联统计好的重复次数结果再执行更新:
UPDATE company_parc cp INNER JOIN ( SELECT MchCode, PointingDate, COUNT(*) AS DailyPointing FROM company_parc GROUP BY MchCode, PointingDate HAVING COUNT(*) > 1 ) stat ON cp.MchCode = stat.MchCode AND cp.PointingDate = stat.PointingDate SET cp.TheoreticalHoursByMonth = cp.TheoreticalHoursByMonth / stat.DailyPointing;
前置校验建议
为避免误更新数据,可先执行以下SELECT语句核对计算结果,确认逻辑正确后再执行UPDATE操作:
SELECT cp.MchCode, cp.PointingDate, cp.TheoreticalHoursByMonth, stat.DailyPointing, cp.TheoreticalHoursByMonth / stat.DailyPointing AS calculated_new_value FROM company_parc cp INNER JOIN ( SELECT MchCode, PointingDate, COUNT(*) AS DailyPointing FROM company_parc GROUP BY MchCode, PointingDate HAVING COUNT(*) > 1 ) stat ON cp.MchCode = stat.MchCode AND cp.PointingDate = stat.PointingDate;
提示:执行更新操作前建议先备份原表数据,避免误操作导致数据丢失。
内容的提问来源于stack exchange,提问作者NIIBCH
相关产品推荐
相关产品推荐

