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

SQL 重複しているレコードを一括でUPDATEする

ある列の値が同じレコードが複数ある場合に、そのレコードを全てUPDATEする方法を紹介します。

重複しているレコードを1行に集約する方法などはよく見かけますが、重複するレコードを一括でUPDATEします。

以下の例ではテーブルACOL1,COL2が同一のレコードが複数あるデータをUPDATEしています。

UPDATE A
SET
  COL3 = 'このレコードは重複しています。'
WHERE (A.COL1, A.COL2) IN (
  SELECT
    SUB.COL1
    ,SUB.COL2
  FROM A AS SUB
  GROUP BY
    SUB.COL1
    ,SUB.COL2
  HAVING
    COUNT(*) > 1
)

HAVING句

HAVING句はGROUP BYで集計した値に対して絞り込みをします。

重複チェックをしたい列をGROUP BYで集計し、集計結果(COUNT)が1より大きい場合は値が同じレコードが複数存在することになります。

WHERE句はGROUP BYで集計する前の値に対して絞り込みを行うので混同しないように注意が必要です。

EXISTSを使う方法

以下のようにEXISTSを使う方法もあります。

テーブル構成やデータ量にもよりますが、上記で紹介したHAVING句を使う方法のほうがパフォーマンスはよかったです。

UPDATE A
SET
  COL3 = 'このレコードは重複しています。'
WHERE EXISTS (
  SELECT 1
  FROM A AS SUB
  WHERE
    SUB.COL1 = A.COL1
    AND SUB.COL2 = A.COL2
)

関連記事