371
326

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-02-23

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

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でソートしてるのは見やすくするためです。

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

371
326
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
371
326

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?