0

1 つの列に重複するエントリがあるテーブルのすべてのエントリのレポートを作成したいと考えています。次のようなテーブルがあるとします。

customer_name     | some_number
Tom                 1
Steve               3
Chris               4
Tim                 3
...

some_number重複しているすべてのレコードを表示したい。次のようなクエリを使用して、すべての重複レコードを表示しました。

select customer_name, some_number from table where some_number in (select some_number from table group by some_number having count(*) > 1) order by some_number;

これは小さなテーブルで機能しますが、実際に操作する必要があるテーブルはかなり大きいです。30,000 行以上あり、永遠にかかっています。誰かがこれを行うためのより良い方法を持っていますか?

ありがとう!

4

2 に答える 2

1

このクエリを試してください:

SELECT t1.*
FROM (SELECT some_number, COUNT(*) AS nb
       FROM your_table
       GROUP BY some_number
       HAVING nb>1
     ) t2, your_table t1
WHERE t1.some_number=t2.some_number

クエリは最初GROUP BYに重複レコードを検索するために使用し、次にテーブルと結合してすべてのフィールドを取得します。
が使用されているためHAVING、関心のあるレコードのみが返され、 で結合されyour_tableます。

some_numberクエリを高速にしたい場合は、テーブルにインデックスがあることを確認してください。

于 2012-08-15T14:31:39.647 に答える
1

これはパフォーマンスが向上しますか?カウントのテーブルに結合してから、1 よりsome_number大きいものだけを含めるようにフィルター処理しますcount

SELECT t.customer_name, t.some_number 
FROM my_table t
INNER JOIN (
  SELECT some_number, COUNT(*) AS ct
  FROM my_table
  GROUP BY some_number ) dup ON t.some_number = dup.some_number
 WHERE dup.ct > 1
于 2012-08-15T14:34:54.180 に答える