【问题标题】:Updating MySQL table using AVG calculated from same table使用从同一表计算的 AVG 更新 MySQL 表
【发布时间】:2021-12-05 21:33:59
【问题描述】:
我正在尝试update所有工资低于表中所有工资平均值的行。
UPDATE PostOfficeStaff
SET salary = salary * 1.05
WHERE officeNo = 1
AND salary < (SELECT AVG(salary) FROM PostOfficeStaff)
这给了我一个错误提示
您不能在 FROM 子句中指定目标表 'PostOfficeStaff' 进行更新
我也试过这个不带 FROM PostOfficeStaff 的查询,虽然它没有给我错误,但它什么也没做。
我该怎么做?
【问题讨论】:
标签:
mysql
sql-update
average
【解决方案1】:
您可以将其包装在外部查询中,例如:
UPDATE PostOfficeStaff
SET salary = salary * 1.05
WHERE officeNo = 1
AND salary < (SELECT * FROM (
SELECT AVG(salary)
FROM PostOfficeStaff
) as t1
)
检查:https://dev.mysql.com/doc/refman/8.0/en/update.html
来自MySQL 文档:
mysql> UPDATE items
> SET retail = retail * 0.9
> WHERE id IN
> (SELECT id FROM items
> WHERE retail / wholesale >= 1.3 AND quantity > 100);
ERROR 1093 (HY000): You can't specify target table 'items' for update in FROM clause
相反,您可以使用多表更新,其中子查询被移动到要更新的表列表中,使用别名在最外层的 WHERE 子句中引用它,如下所示:
UPDATE items,
(SELECT id FROM items
WHERE id IN
(SELECT id FROM items
WHERE retail / wholesale >= 1.3 AND quantity < 100))
AS discounted
SET items.retail = items.retail * 0.9
WHERE items.id = discounted.id;
【解决方案2】:
您可以将JOIN 与计算表一起使用,例如:
UPDATE PostOfficeStaff
JOIN (
SELECT AVG(salary) avg_salary FROM PostOfficeStaff
) avg_salary ON avg_salary > salary
SET salary = salary * 1.05
WHERE officeNo = 1;
SQL Join fiddle