複数の結合があるステートメントのテーブルを更新したい。 (オプティマイザーのヒントを使用している場合を除き)結合の順序は実際には重要ではないことはわかっていますが、読みやすいように特定の方法を指定しました。ただし、これにより、更新したいテーブルが元のテーブルではなくなり、更新に問題が発生します。
私がやりたいことのダミーの例は次のようなものです:
UPDATE b
FROM tableA a
JOIN tableB b
ON a.a_id = b.a_id
JOIN tableC c
ON b.b_id = c.b_id
SET b.val = a.val+c.val
WHERE a.val > 10
AND c.val > 10;
ここには結合による更新に関する多くの投稿がありますが、常に最初に更新されるテーブルがあります。これはSQL Serverで可能ですが、できればMySQL Tooでも可能です。
MySQLのマルチテーブルUPDATE構文は、Microsoft SQL Serverとは異なります。更新しているテーブルを指定する必要はありません。これはSET句で暗黙的に指定されます。
UPDATE tableA a
JOIN tableB b
ON a.a_id = b.a_id
JOIN tableC c
ON b.b_id = c.b_id
SET b.val = a.val+c.val
WHERE a.val > 10
AND c.val > 10;
MySQLの構文にはFROM句がありません。
JOINを使用したUPDATEは標準SQLではなく、MySQLとMicrosoft SQL Serverの両方が標準構文の拡張として独自のアイデアを実装しています。
ステートメントの順序が間違っています。構文 here を読むことができます(読みにくいです。
UPDATE tableA a
JOIN tableB b
ON a.a_id = b.a_id
JOIN tableC c
ON b.b_id = c.b_id
SET b.val = a.val+c.val
WHERE a.val > 10
AND c.val > 10;
この状況で使用できる別の正しい構成:
UPDATE T1, T2,
[INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1
SET T1.C2 = T2.C2,
T2.C3 = expr
WHERE condition
上記の例は、 MySQL UPDATE JOIN から取ります。
MySQL 8.0リファレンスマニュアル に到達すると、 複数テーブルUPDATE構文 の説明が見つかります:
UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET assignment_list
[WHERE where_condition]
table_references句は、
join
に含まれるテーブルをリストします。
複数テーブルのMySQLの構文は、反対にFROM
、ORDER BY
またはLIMIT
句をサポートしていませんtosingle-table syntax。