SQL 重複しているレコードを一括でUPDATEする
ある列の値が同じレコードが複数ある場合に、そのレコードを全てUPDATE
する方法を紹介します。
重複しているレコードを1行に集約する方法などはよく見かけますが、重複するレコードを一括でUPDATE
します。
以下の例ではテーブルA
のCOL1
,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
)