【问题标题】: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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-17
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      相关资源
      最近更新 更多