重複しているレコードを検索するSQL(大量データも対応)

たまにしかやらないけど、
毎回やり方を調べている気がするので備忘録としてメモ。

DISTINCTを使って重複した行をまとめることはできるけど、
逆はできないので、強引に対応する。

列Aが重複しているデータを取得

SELECT
  A
FROM
  テーブルA
GROUP BY
  A
HAVING
  COUNT(A) > 1

列Aが重複しているデータと重複している件数も一緒に取得

SELECT
  COUNT(A) duplicate_count
  , A
FROM
  テーブルA 
GROUP BY
  A
HAVING
  COUNT(A) > 1

COUNT足しただけ。
このままだと重複している列のデータしかわからないので、他の列のデータも取得する

重複している列Aを含む全列取得

SELECT
  * 
FROM
  テーブルA
where
  A in ( 
    SELECT
      A
    FROM
      テーブルA
    GROUP BY
      A
    HAVING
      COUNT(A) > 1
  ) 
ORDER BY
  A

重複している列Aを含む全列と重複している件数を一緒に取得

SELECT
 *
FROM
  テーブルA table1
  INNER JOIN ( 
    SELECT
      COUNT(A) duplicate_count
      , A
    FROM
      テーブルA
    GROUP BY
      A 
    HAVING
      COUNT(A) > 1
  ) table2
    ON table1.A = table2.A
ORDER BY
  table1.A

上記のタイプのSQLだと
データ件数が多いと返ってこない可能性があるので、
こんな感じに書くとイケるはず(多分)。

データの件数が多いとき

SELECT
  * 
FROM
  テーブルA table1
WHERE
  EXISTS ( 
    SELECT
      *
    FROM
      テーブルA table2 
    WHERE
      table1.A = table2.A
    GROUP BY
      table2.A
    HAVING
      COUNT(table2.A) > 1
  ) 
ORDER BY
  table1.A

書いてみて、最後のやつだけでいいじゃんってなったけど気にしないw

ORDER BYでソートしてるのは見やすくするためです。

もっと良いやり方あるかもしれないけど、とりあえずこれで。

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
コメント
この記事にコメントはありません。
あなたもコメントしてみませんか :)
すでにアカウントを持っている方は
ユーザーは見つかりませんでした