UPDATEクエリで3つのテーブルを結合する方法


466

私は質問をし、この回答を得て助けになりました。

   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
もちろん可能です。試してみる。構文はあなたが持っているのと同じです- クエリの場合と同じように、次JOINとそのON条件を追加するだけですSELECT
Michael Berkowski 2013年

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 2013年

1
上記の質問はここにある:stackoverflow.com/questions/15206746/...
ウルス

回答:


810

答えは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ソフトウェアは影響を受けた行を報告しないが、データは更新が行われたことを示している。
ピアノマン2016

1
@Pianoman私にとっても同じように起こり、ON UPDATE CURRENT_TIMESTAMPと関係がありました。手動で更新を追加し、それを修正しました。他の誰かに起こったかどうかを言っているだけです
eric.itzhak

結合を正しくするために視覚的な補助が必要な場合:browse-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不可能ですか?
Green

42

同じ結果得る別の方法は、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
ノエ・ニエト

7
これは、暗黙のないJOIN同じようにはやってSELECT * FROM TABLE_A, TABLE_B ...ない
Madbreaks

それでは、5.5では暗黙的な結合フォームのみが更新のために受け入れられるということですか?
userfuser 2015

ノー@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 2016年

4
まったく同じ結果ではありません-結合構文で左結合を行うことができます。
Gerard ONeill、2016年

10

以下に含まれる更新クエリである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')

3
Stack Overflowへようこそ!このコードスニペットをお寄せいただきありがとうございます。すぐに役立つ情報が得られる場合があります。適切な説明は、なぜこれが問題の良い解決策であるを示すことによって教育的価値を大幅に改善し、同じではないが同じ質問をする将来の読者にとってより役立つでしょう。回答を編集して説明を追加し、適用される制限と前提を示してください。
Toby Speight 2017年

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; 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.