SQL 別テーブルをSELECTした結果が存在すればその値を使用してUPDATEする方法
SQL 別テーブルをSELECTした結果をそのままINSERTする方法でSELECTした結果をそのままINSERTする方法を紹介しましたが、同じようにSELECTした結果がすでに存在していればその値でUPDATEしたい場合があります。
SELECTした結果を更新値にセット
まずはSQL UPDATE文で副問い合わせで取得した値を複数列に設定する方法で紹介したように、更新する値を副問い合わせで実装します。
UPDATE A
SET COL2 = (
SELECT
B.COL2
FROM B
WHERE
A.COL1 = B.COL1
--テーブルAの値に紐づくテーブルBのデータを取得するのが一般的
)上記SQLだと、テーブルBの存在の有無にかかわらず、テーブルAの全てのデータが更新されてしまいます。
WHERE句に条件を追加
テーブルBが取得できるデータのみ更新したい場合は、WHERE句に同じSQLを追加し、取得結果が存在する場合のみUPDATEするようにします。
UPDATE A
SET COL2 = (
SELECT
B.COL2
FROM B
WHERE
A.COL1 = B.COL1
--テーブルAの値に紐づくテーブルBのデータを取得するのが一般的
)
WHERE EXISTS (
--SETのSQLと同じ条件
SELECT 1
FROM B
WHERE
A.COL1 = B.COL1
)MERGE文を使う方法
上記SQLでは同じSQLを2つ実装しなければなりませんが、UPDATE文ではなくMERGE文を使えばもっと効率よく実装できます。
MERGE INTO A
USING (
SELECT
COL1,
COL2,
COL3
FROM
B
) B
ON (
A.COL1 = B.COL1 --結合条件
)
--既に登録されている場合は更新
WHEN MATCHED THEN
UPDATE SET
A.COL2 = B.COL2,
A.COL3 = B.COL3登録されていればUPDATE、されていなければINSERTといったような処理も実装できるので、MERGE文は使いこなせればかなり強力な武器になります。
MERGE文の詳しい使い方についてはSQL MERGE文でSELECTした結果を使ってINSERTまたはUPDATEをするで紹介しています。