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をするで紹介しています。