【问题标题】:MySQL UPDATE with needed subquery带有所需子查询的 MySQL UPDATE
【发布时间】:2017-02-17 13:02:50
【问题描述】:

对于学校,我有以下任务将数据更新到数据库中:

给所有员工(位于employee表中) 谁在员工“50”(员工代码)工作的项目中工作以及加薪 250 欧元

我知道我必须在 employee 中获得SAL 列,然后将其提高 250 欧元。我目前通过以下查询做到了这一点。

UPDATE `work` AS work
INNER JOIN `employee` AS employee ON employee.`CODE` = work.`W_CODE`
SET employee.`SAL` = (employee.`SAL` + 250)
WHERE work.`P_CODE` IN  ( # .... );

P_CODE 列代表项目标识符。在work 表中,列出了所有员工他们正在从事的当前项目。

为了获取代码 50employee 所从事的项目,我进行了以下子查询:

UPDATE `work` AS work
INNER JOIN `employee` AS employee ON employee.`CODE` = work.`W_CODE`
SET employee.`SAL` = (employee.`SAL` + 250)
WHERE work.`P_CODE` IN (SELECT work.`P_CODE` 
                        FROM `work` AS work
                        INNER JOIN `employee` AS employee ON `employee`.`CODE` = work.`W_CODE`
                        WHERE employee.`CODE` = "50");

运行此查询时,我收到此错误:

错误代码:1093。表“工作”被指定了两次,既作为“更新”的目标,又作为数据的单独源

为了我自己的尝试,我做了一些研究,发现我不能为此使用同一张表两次。

问题

我怎样才能修复这个查询,子查询可以工作?可以在我第一次加入时合并吗?

【问题讨论】:

    标签: mysql subquery inner-join


    【解决方案1】:

    尝试使用不同的别名,例如:w1 和 w2 用于工作

    UPDATE `work` 
        AS w1
    
        INNER JOIN `employee` AS employee
            on employee.`CODE` = w1.`W_CODE`
    
        SET employee.`SAL` = (employee.`SAL` + 250)
    
        WHERE w1.`P_CODE` IN  ( select t.my_code from (
        SELECT w2.`P_CODE` as my_code 
            FROM `work` AS w2
            INNER JOIN `employee` AS employee
                ON `employee`.`CODE` = w2.`W_CODE`
            WHERE employee.`CODE` = "50"
        )  t ) ;
    

    【讨论】:

    • 它返回了Error Code: 1093. Table 'w1' is specified twice, both as a target for 'UPDATE' and as a separate source for data。我什至不明白发生了什么。
    • 我已经更新了强制动态临时表的答案
    • 为什么最后有t
    • @bas t 是动态临时表名。当您以这种方式创建表时,您必须指定一个名称 .. 最终引用表列 .. 在您的情况下,您不需要引用此表列,但在某些情况下您需要例如:work.p_code = t .my_code ..
    • 但是你不是用my_code 别名做的吗?
    【解决方案2】:

    将员工更新为 e1 设置 e1.Salary=(e1.Salary+20) e1.workId 在哪里 ( 从 ( 从员工中选择 e2.workId 作为 e2 内部联接在 e2.workId=w2.id 上作为 w2 工作 其中 e2.workId=50 ) 作为 x)

    详细解释见链接: http://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-target-in-mysql/

    【讨论】:

      【解决方案3】:

      @Bas 在上面的查询中,我考虑过要更新员工表,以便您可以相应地进行更改。

      如果结构如下,则此查询可以正常工作:

      1)员工表 ..................... empid(P 键) | workId(F 键) |姓名 |薪水

      2)工作台 id (P 键) |工作代码

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-05
        相关资源
        最近更新 更多