SQL如何在WHERE条件中使用AVG()?更新表出现1093错误怎么处理?
错误原因
该报错是MySQL的特有限制:对一张表执行UPDATE操作时,不允许直接在子查询的FROM子句中引用同一张正在更新的目标表,避免同时读写产生数据冲突。
解决方案1:子查询外层嵌套派生表
将计算平均年龄的子查询再套一层匿名临时表,MySQL会将其识别为独立的派生结果集,即可规避同表引用限制:
UPDATE Employee SET Employee_Age = Employee_Age + 10 WHERE Employee_Age != ( SELECT avg_age FROM ( SELECT AVG(Employee_Age) AS avg_age FROM Employee ) AS temp )
解决方案2:提前用变量存储平均年龄
先把平均年龄计算后存入用户变量,更新时直接引用变量,也可以避开限制,可读性更高:
-- 先计算并存储平均年龄 SELECT AVG(Employee_Age) INTO @avg_age FROM Employee; -- 执行更新 UPDATE Employee SET Employee_Age = Employee_Age + 10 WHERE Employee_Age != @avg_age;
内容的提问来源于stack exchange,提问作者Hasibur Rahman
相关产品推荐
相关产品推荐

