3在UPDATE查询中如何做表JOIN?


465

我问了一个问题,得到了答复,这很有帮助。

   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

现在,如果有3张表涉及这样的事情,我正在寻找这样做。

    UPDATE tableC c JOIN tableB b JOIN tableA a

我的问题基本上是...这可以在一个UPDATE语句上进行3个表联接吗?正确的语法是什么?谢谢。我会做...

 JOIN tableB, tableA
 JOIN tableB JOIN tableA

2
当然可以。试试看。语法就像您拥有它一样-您只需要添加next JOIN及其ON条件,就像在SELECT查询中一样。
Michael Berkowski

2
UPDATE t1 JOIN t2 ON t1.id = t2.t1_id JOIN t3 ON t3.id = t2.t3_id SET t1.col = 'newval'
Michael Berkowski

1
提到的问题在这里:stackoverflow.com/questions/15206746/…–
Urs

Answers:


807

答案是yes你可以

这样尝试

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]

2
奇怪的是,尽管数据显示更新已完成,但是我的HeidiSQL软件报告的受影响的行为零。
Pianoman

1
@Pianoman对我来说,它也发生了,并且与ON UPDATE CURRENT_TIMESTAMP有关,我只是手动添加了更新,并对其进行了修复,只是说它是否发生在其他人身上
eric.itzhak

如果您需要视觉帮助来确保正确的连接,请执行以下操作:browser-tutorials.com/tutorial/mysql-joins-visual-representation
ram4nd

我认为以下是更好的总体规划:(请UPDATE table A JOIN table B ON {join data} JOIN table C ON {join data} JOIN {more join tables} SET A.column = {expression}原谅我,如果这位
受过抨击的

哪里WHERE?? 还是WHERE不可能?
格林

41

获得相同结果的另一种方法是根本不使用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

3
我在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
Noe Nieto

7
这确实一个隐含的JOIN以同样的方式做SELECT * FROM TABLE_A, TABLE_B ...
Madbreaks

那么这是否意味着在5.5中仅接受隐式联接形式进行更新?
userfuser

@userfuser不,不是,该手册指出了语法: UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]稍后,该手册指出:“该table_references子句列出了连接所涉及的表。其语法在第13.2.9.2节,JOIN语法中进行了描述。”
hmundt'3

4
结果并不完全相同-您可以使用连接语法进行左连接。
Gerard ONeill

10

以下是同时包含JOINWHERE两者的Update查询。我们可以使用多个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')

3
欢迎使用Stack Overflow!感谢您提供此代码段,它可能会立即提供帮助。正确的解释显示为什么这是解决问题的好方法,从而大大提高其教育价值,并且对将来有相似但不相同的问题的读者来说更有用。请编辑您的答案以添加解释,并指出适用的限制和假设。
Toby Speight

2

我只是将其作为一个独立的答案添加了一个替代性的总体计划,因为爆炸的“对答案的评论”不会发布换行而不发布整个编辑,即使它尚未完成。

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;

1

对于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; 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.