先日、EC-CUBEのDBを管理していると、一意であるはずの品番がテーブル内に複数存在することが分かった。

この時、重複する品番を持つデータを全て抽出する必要があったので、その時使ったクエリを備忘録としてまとめておく。

SELECT product_code, COUNT(product_code) 重複数
FROM dtb_product_class
WHERE del_flg = 0
GROUP BY product_code
HAVING COUNT(product_code) > 1
ORDER BY product_code
;

簡単にクエリの解説をしておこう。

まず、3行目のWHERE句はあっても無くても良い。
ここでは削除済みのデータを抽出対象から除くためにこの条件を追加している。

ポイントは5行目のHAVING句。
HAVING句はGROUP BYでグルーピングした後の結果に対し、条件を指定することができるので、ここでは品番の数をCOUNTし、結果が2以上(つまり重複)のデータを抽出条件としている。

このクエリを実行すると、重複する品番を持つデータを全て抽出することができる。