3

私は 100 万件近くのレコードを含むデータベース テーブルを持っています - それらのいくつが重複しているかを確認するクエリを作成したとき - 重複しているレコードが 90,000 件近くあります - 重複とは、同じ電子メール アドレスを持つレコードを意味します - 1 つの電子メール アドレスのように- 10 件のレコードが存在する可能性があります。

サンプルデータ

ID | 名前 | メール | 電話
 1 | abc | abc@gmail.com | 12345
 2 | デフ | def@gmail.com | 12533
 3 | abc | abc@gmail.com |
 4 | ひじ | hij@gmail.com | 50633   
 5 | abc | abc@gmail.com | 12345
 6 | デフ | def@gmail.com |

1) ID は、テーブルの自動インクリメント主キーです。

2) def@gmail.com のように 2 つのレコードが存在する場合 - 電話を含むレコードを保持し、他のレコードを削除する必要があります

3) abc@gmail.com の場合 - 3 つのレコードがあります - 電話のないレコードが削除されます - 残りの 2 つのうち - どちらにもすべてのデータがありますが - 最初のレコードを保持し、2 番目のレコードを削除します

条件に基づいて削除ステートメントを作成することは可能ですか、またはこれを達成するためのより簡単な方法はありますか?

遊んでみる SQLfiddle - http://sqlfiddle.com/#!2/cf8c7

どうもありがとう

4

2 に答える 2

0

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

DELETE b.* FROM table1 a INNER JOIN table1 b ON a.name = b.name AND a.id < b.id
于 2013-12-09T12:52:57.417 に答える
0
DELETE FROM phoney ph
WHERE ph.zphone IS NULL
AND EXISTS (SELECT *
        FROM phoney ex
        WHERE ex.zname = ph.zname
        AND ex.zemail = ph.zemail
        AND ex.zphone IS NOT NULL
        );

DELETE FROM phoney ph
WHERE ph.zphone IS NOT NULL
AND EXISTS (SELECT *
        FROM phoney ex
        WHERE ex.zname = ph.zname
        AND ex.zemail = ph.zemail
        AND ex.id < ph.id
        );

SELECT * FROM phoney;

結果:

DELETE 2
DELETE 1
 id | zname |    zemail     | zphone 
----+-------+---------------+--------
  1 | abc   | abc@gmail.com | 12345
  2 | def   | def@gmail.com | 12533
  4 | hij   | hij@gmail.com | 50633

注: 2 つの削除クエリを組み合わせることができますが、その結果、WHERE 句で AND/OR 条件が乱雑になり、エラーが発生しやすくなります

于 2012-08-06T20:57:51.247 に答える