zukucode
主にWEB関連の情報を技術メモとして発信しています。

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


関連記事