SQL UPDATE with JOINによる複数テーブルの更新
別テーブルの値に基づいて行を更新するSQL UPDATE with JOINの方法を学びます。PostgreSQLとMySQLの構文の違いも解説します。
DML
詳細な説明
SQL UPDATE with JOINによる複数テーブルの更新
別テーブルのデータに基づいて行を更新することは一般的な要件です。構文はデータベースシステムによって異なりますが、概念は同じです。
PostgreSQLの構文
UPDATE orders o
SET status = 'vip_order',
discount = 0.15
FROM customers c
WHERE o.customer_id = c.id
AND c.tier = 'VIP';
PostgreSQLでは FROM 句で追加テーブルを結合します。
MySQLの構文
UPDATE orders o
INNER JOIN customers c ON o.customer_id = c.id
SET o.status = 'vip_order',
o.discount = 0.15
WHERE c.tier = 'VIP';
MySQLではJOINをUPDATE文の中に直接記述します。
SQL Serverの構文
UPDATE o
SET o.status = 'vip_order',
o.discount = 0.15
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id
WHERE c.tier = 'VIP';
サブクエリによる更新(標準SQL)
UPDATE orders
SET discount = 0.15
WHERE customer_id IN (
SELECT id FROM customers WHERE tier = 'VIP'
);
このアプローチはすべてのデータベースシステムで動作しますが、複雑な条件の場合はより低速になる場合があります。
集約値による更新
UPDATE products p
SET avg_rating = sub.avg_rating
FROM (
SELECT product_id, AVG(rating) AS avg_rating
FROM reviews
GROUP BY product_id
) sub
WHERE p.id = sub.product_id;
安全上の注意
- 必ずWHERE句を使用すること。 WHERE句のないUPDATEはテーブルのすべての行を変更する
- まずSELECTでテスト:
UPDATE ... SETをSELECTに置き換えて、影響を受ける行をプレビューする - トランザクションを使用: 更新を
BEGIN/COMMITで囲み、問題があればROLLBACKできるようにする - 行数を確認: 更新後、影響を受けた行数が予想と一致するか確認する
- 一括更新前にバックアップ: 重要なテーブルでは、大量更新前にバックアップまたはスナップショットを作成する
UPDATE with JOINは、関連テーブル間でデータを同期し、外部条件に基づいた条件付き変更を適用するための強力なパターンです。
ユースケース
注文管理システムが、別のcustomersテーブルに格納された顧客ティアに基づいて、JOINを使ったUPDATE文でVIP割引を注文レコードに適用する場面。