【问题标题】:Update and selection operation at the same table同表更新和选择操作
【发布时间】:2019-09-27 08:40:18
【问题描述】:

表:

|E_NAME|COMPANY|POSITION|SALARY|

试过了:

UPDATE 
   COMPANY
SET 
   SALARY = SALARY + (SALARY * 0.05)
WHERE 
   ((POSITION = 'DOCTOR' OR POSITION = 'ENGINEER')
   AND SALARY < (SELECT AVG(SALARY) FROM COMPANY))

MySQL 错误:表 'COMPANY' 被指定了两次,都作为 'UPDATE' 并作为单独的数据源

【问题讨论】:

    标签: mysql sql database select


    【解决方案1】:

    将平均子查询包装在另一个子查询中以解决此问题:

    UPDATE COMPANY
    SET SALARY = SALARY + (0.05 * SALARY)
    WHERE
        POSITION IN ('DOCTOR', 'ENGINEER') AND
        SALARY < (SELECT avg_salary FROM
                     (SELECT AVG(SALARY) AS avg_salary FROM COMPANY) x);
    

    【讨论】:

    • @RaymondNijland 如果你想要一个简短的版本,请使用:SALARY = 1.05 * SALARY
    • 确实你需要在SALARY = 1.05 * SALARY 中使用1.05 而不是0.05 作为因素...接缝我需要更多的咖啡.. 我也希望看到SALARY =* 1.05 作为语法糖SALARY = 1.05 * SALARY 在 SQL 标准中顺便说一句..
    【解决方案2】:

    将子查询移至FROM 子句:

    UPDATE COMPANY C CROSS JOIN
           (SELECT AVG(SALARY) AS AVG_SALARY FROM COMPANY) a
        SET C.SALARY = C.SALARY + (C.SALARY * 0.05)
    WHERE POSITION IN ('DOCTOR', 'ENGINEER') AND
          C.SALARY < a.AVG_SALARY;
    

    注意能够引用正在更新的表是 MySQL 的限制。令人高兴的是,它允许在UPDATEs(和DELETEs)中使用JOINs。

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 2014-09-01
      • 2018-09-19
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多