重複レコードの抽出
やりたいこと
以下のようなテーブルが存在した場合に「PRODUCT_CD」、「PRODUCT_NAME」が重複しているレコードを抽出します。
ID | PRODUCT_CD | PRODUCT_NAME | PRICE |
---|---|---|---|
1 | p001 | ノート | 350 |
2 | p002 | ボールペン | 150 |
3 | p002 | ボールペン | 100 |
4 | p003 | 手帳 | 1000 |
5 | p003 | 手帳 | 500 |
6 | p003 | 手帳 | 350 |
重複レコードを1行にまとめて抽出
重複しているレコードをGROUP BY
とHAVING
句を使用して抽出します。
SELECT product_cd,
product_name,
COUNT(1) -- 重複している件数
FROM product_tbl
GROUP BY product_cd, product_name
HAVING COUNT(1) > 1
;
抽出結果は以下のようになります。
PRODUCT_CD | PRODUCT_NAME | COUNT(1) |
---|---|---|
p002 | ボールペン | 2 |
p003 | 手帳 | 3 |
重複レコードを全件抽出
上記SQLでは重複レコードをまとめて抽出しましたが、重複レコードの内容を詳しく確認したい場合もあります。
その場合には下記のように対象データを副問い合わせを使用して抽出します。
SELECT *
FROM product_tbl
WHERE (product_cd, product_name)
IN (
SELECT product_cd, product_name
FROM product_tbl
GROUP BY product_cd, product_name
HAVING COUNT(*) > 1
)
ORDER BY product_cd
;
抽出結果は以下のようになります。
ID | PRODUCT_CD | PRODUCT_NAME | PRICE |
---|---|---|---|
2 | p002 | ボールペン | 150 |
3 | p002 | ボールペン | 100 |
4 | p003 | 手帳 | 1000 |
5 | p003 | 手帳 | 500 |
6 | p003 | 手帳 | 350 |