重複レコードの抽出
やりたいこと
以下のようなテーブルが存在した場合に「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 |