【问题标题】:How can I do three table JOINs in an UPDATE query?如何在 UPDATE 查询中执行三个表 JOIN?
【发布时间】:2013-02-19 00:06:59
【问题描述】:

我问了一个问题并得到了帮助。

   UPDATE TABLE_A a JOIN TABLE_B b
   ON a.join_col = b.join_col AND a.column_a = b.column_b
   SET a.column_c = a.column_c + 1

现在,如果涉及到三个表,我希望这样做。

    UPDATE tableC c JOIN tableB b JOIN tableA a

我的问题基本上是......是否可以在 UPDATE 语句上进行三个表连接?它的正确语法是什么?

我要执行以下操作吗?

 JOIN tableB, tableA
 JOIN tableB JOIN tableA

【问题讨论】:

  • 当然可以。试一试。语法就像您拥有的一样 - 您只需添加下一个 JOIN 及其 ON 条件,就像在 SELECT 查询中一样。
  • UPDATE t1 JOIN t2 ON t1.id = t2.t1_id JOIN t3 ON t3.id = t2.t3_id SET t1.col = 'newval'

标签: mysql join


【解决方案1】:

答案是是的,你可以。

试试这样:

UPDATE TABLE_A a
    JOIN TABLE_B b ON a.join_col = b.join_col AND a.column_a = b.column_b
    JOIN TABLE_C c ON [condition]
SET a.column_c = a.column_c + 1

对于一般的更新加入:

UPDATE TABLEA a
JOIN TABLEB b ON a.join_colA = b.join_colB
SET a.columnToUpdate = [something]

【讨论】:

  • 奇怪的是,我的 HeidiSQL 软件报告的受影响行为零,尽管数据显示更新已完成。
  • @Pianoman 对我来说它也发生了,它与 ON UPDATE CURRENT_TIMESTAMP 有关,我只是手动添加了更新并修复了它,只是说它是否发生在其他人身上
  • 如果您需要视觉辅助来正确连接:browse-tutorials.com/tutorial/mysql-joins-visual-representation
  • 我认为以下是一个更好的总体规划:UPDATE table A JOIN table B ON {join data} JOIN table C ON {join data} JOIN {more join tables} SET A.column = {expression}(如果这个该死的编辑不让我在没有完整发布的情况下输入换行符,请原谅我)
  • @green WHERE 排在最后,在 SET 之后。 echo_Me 请在您的帖子中添加 WHERE,因为后面的 cmets 不会显示。
【解决方案2】:

achieving the same result 的另一种方法是根本不使用 JOIN 关键字。

UPDATE TABLE_A, TABLE_B
SET TABLE_A.column_c = TABLE_B.column_c + 1
WHERE TABLE_A.join_col = TABLE_B.join_col

【讨论】:

  • 我在 5.5.62 上试过这个,mysql 不喜欢这种语法。根据手册[dev.mysql.com/doc/refman/5.6/en/update.html],查询应该是:UPDATE TABLE_A, TABLE_B SET TABLE_A.column_c = TABLE_A.column_c +1 WHERE TABLE_A.join_col = TABLE_B.join_col
  • 这会以与SELECT * FROM TABLE_A, TABLE_B ... 相同的方式执行隐式JOIN
  • 那么这是否意味着在 5.5 中只接受隐式连接形式进行更新?
  • @userfuser 不,它没有,手册说明语法:UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] 后来,手册指出:“table_references 子句列出了连接中涉及的表。它的语法是在Section 13.2.9.2, JOIN Syntax 中描述。”
  • 不完全相同的结果——您可以使用连接语法进行左连接。
【解决方案3】:

下面是 update 查询,其中包括 JOINWHERE。同理,我们可以使用多个 join/where 子句:

UPDATE opportunities_cstm oc JOIN opportunities o ON oc.id_c = o.id
 SET oc.forecast_stage_c = 'APX'
 WHERE o.deleted = 0
   AND o.sales_stage IN('ABC','PQR','XYZ')

【讨论】:

  • 欢迎来到 Stack Overflow!感谢您提供此代码 sn-p,它可能会提供一些即时帮助。一个正确的解释would greatly improve 其教育价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有类似但不相同的问题的读者更有用。请edit您的答案添加解释,并说明适用的限制和假设。
【解决方案4】:

另一种总体规划

UPDATE table A
JOIN table B ON {join fields}
JOIN table C ON {join fields}
JOIN {as many tables as you need}
SET A.column = {expression}

例子:

UPDATE person P
JOIN address A ON P.home_address_id = A.id
JOIN city C ON A.city_id = C.id
SET P.home_zip = C.zipcode;

【讨论】:

    【解决方案5】:

    是的,您可以为更新语句执行三表连接。这是一个例子:

    UPDATE customer_table c
    
      JOIN
          employee_table e
          ON c.city_id = e.city_id
      JOIN
          anyother_ table a
          ON a.someID = e.someID
    
    SET c.active = "Yes"
    
    WHERE c.city = "New york";
    

    【讨论】:

      【解决方案6】:

      以 PostgreSQL 为例:

      UPDATE TableA AS a
      SET param_from_table_a=FALSE -- param FROM TableA
      FROM TableB AS b
      WHERE b.id=a.param_id AND a.amount <> 0;
      

      【讨论】:

        【解决方案7】:

        没有一个答案对我不起作用我在 mysql 手册上找到了这个

        UPDATE T1,T2 INNER JOIN T2 ON T1.C1 = T2.C1 SET T1.C2 = T2.C2,       T2.C3 = expr WHERE condition
        

        【讨论】:

          猜你喜欢
          • 2017-11-19
          • 2015-05-22
          • 2011-05-19
          • 1970-01-01
          相关资源
          最近更新 更多