おはこんばちわ、さわちゃんです。
休憩時間に休憩室で一緒にカップラーメンを食べる人募集中です!!(笑)
今回の記事は自分の勉強がてら、MySQLで重複レコードを抽出する方法について書いていきます。まだまだ勉強中のため、間違った事言ってるかもしれませんが、許してヒヤシンスm( __ __ )m
重複レコードの抽出
データベースにこんなテーブルがあったとします。※テーブル名 test
今回はこの中から色のついている部分、「重複レコード」全てを抽出しようと思います。
さっそくSQLを書いてみます。
SELECT * FROM test
GROUP BY team, item_name
HAVING COUNT(*)>1);
「SELECT」にテーブルを指定!
「GROUP BY」で重複を見つけたい列をグループにする!
「HAVING COUNT(*)>1」で条件指定!!
※今回の条件はGROUP BYで出来たグループのカウントが、2以上のもの
実行!!
実行結果
( ゚д゚)おぉ-!
重複してるデータは絞り込めたけどそうじゃない…
上記のSQLでは重複してるデータ全部を表示できなかったので、いろいろ調べて副問合せ(サブクエリ)を追加することに。。
副問合せ(サブクエリ)を追加する
こんな感じですか?
(。-`ω-)ンー
SELECT * FROM test
WHERE (team, item_name)
in ( SELECT team, item_name
FROM test
GROUP BY team, item_name
HAVING COUNT(*) > 1 );
とのことです。。。((( ;゚Д゚)))
なる程…(⌒_⌒; タラタラ
と、とりあえず実行!
実行結果
おぉ!!
指定したカラムが重複してる行を全て抽出できました!!
めだたしめでたし(´艸`〃)
ただし、データ量が多いテーブルでやると大変なことになるので注意ですよ!
データ量が多いテーブルで重複レコードを抽出する場合
SELECT * FROM テーブル名 x
WHERE EXISTS
(SELECT * FROM テーブル名
WHERE x.[列1]=[列1] and x.[列2]=[列2]
GROUP BY [列1],[列2] HAVING COUNT(*)>1);
()内のSELECTで重複データ(グループ)を抽出し、抽出したデータを条件に今度は()外のSELECTでデータを抽出している様です。
SELECT * FROM テーブルx
WHERE 列y in
(SELECT 列y FROM テーブルx GROUP BY 列y
HAVING COUNT(*) > 1);
調べてみたら意外と情報が無くて大変でした(´-ω-`;)ゞポリポリ