2011-10-26 4 views
1

以前のDBAは2.4Mエントリを持つ非リレーショナルテーブルを管理していました。すべてが一意のIDです。しかし、例えば、各レコードで異なるデータとの重複レコードがあります。MySQLマルチ重複レコードマージ

+---------+---------+--------------+----------------------+-------------+ 
| id  | Name | Address  | Phone | Email  | LastVisited | 
+---------+---------+--------------+---------+------------+-------------+ 
| 1  | bob  | 12 Some Road | 02456 |   |    | 
| 2  | bobby |    | 02456 | [email protected] |    | 
| 3  | bob  | 12 Some Rd | 02456 |   | 2010-07-13 | 
| 4  | sir bob |    | 02456 |   |    | 
| 5  | bob  | 12SomeRoad | 02456 |   |    | 
| 6  | mr bob |    | 02456 |   |    | 
| 7  | robert |    | 02456 |   |    | 
+---------+---------+--------------+---------+------------+-------------+ 

これは、正確なテーブルをイマイチ - これはちょうど私が確認する方法を知って

を説明することである - 実際のテーブルは、32列を持っていますこの場合、私は電話番号を使用しています。私は別のテーブルに重複を抽出しました - 合計730キロのエントリーがあります。

これらのレコードをマージして(不要なレコードに削除のフラグを付ける)最も効率的な方法は何でしょうか?

私はINNER JOINでUPDATEを使用してみましたが、最初のレコードを後続のレコードのデータで更新したいのでWHERE句がいくつか必要です。

私はそのようなFuzzy Dupsなどのサードパーティのソフトウェアを見てきましたが、可能性は

最終目標は、私のようなものが残っているはずだということであれば、私は純粋なMySQLのオプションが欲しい:

+---------+---------+--------------+----------------------+-------------+ 
| id  | Name | Address  | Phone | Email  | LastVisited | 
+---------+---------+--------------+---------+------------+-------------+ 
| 1  | bob  | 12 Some Road | 02456 | [email protected] | 2010-07-13 | 
+---------+---------+--------------+---------+------------+-------------+ 

私はストアドプロシージャ/関数のループを調べるべきでしょうか、それとも私が逃した本当の簡単なことはありますか?

+0

Uは、プロシージャを記述する必要があります...しかし、私はしたいですあなたが電話でグループ化したいのですが、もしそのグループのUが別の名前や住所などを持っていれば、どちらの価値があるのでしょうか? –

+0

私は、いくつかの安定したポイントがあるはずだから、最初のレコードが正しいレコードでなければならないと言うならば。これはすべてのレコードでは当てはまらないかもしれませんが、私はそれを実行する意思があります! – Rucia

答えて

1

Uは、プロシージャを作成する必要がありますが、その は次のようにウル自身TEMP_TABLEを作成する前に:

Insert into temp_table(column1, column2,....) values (select column1, column2... from myTable GROUP BY phoneNumber) 

Uは、uはそれの上にカーソルを実行できるように、上記の物理的なテーブルを作成する必要があります。

すぎるuは次のステップは、各列の値を抽出することである

Insert into similar_tempTable(column1, column2,....) values (Select column1, column2,.... from myTable where phoneNumber=L_phoneNumber) 

として値を含むであろう新しいsimilar_tempTableを作成する必要がPROCEDURE MYPROC {

create a cursor on temp:: 
fetch the phoneNumber and id of the current row from the temp_table to the local variable(L_id, L_phoneNum). 

そして、ここを作成しますsimilar_tempTableから取得し、id = L_idのmyTableの行に更新し、残りの行をmyTableから削除します。

そしてもう一つ、カーソルのすべての反復後similar_tempTableを切り捨てる...これはuのを助ける

希望...

+0

私はあなたを正しく理解しているので、私はカーソルをtempテーブルの上に置き、別のtempテーブルを作成して切り捨てます。そうだとすれば、その場でテーブルを作成するのが遅くなるのだろうか?それとも、私が誤解しているのですか? – Rucia

+0

Uはその完璧を得ています。それはずっと遅くて、電話番号にインデックスを付けて、これを考えると、これは1回実行されるprocです。だから、一度だけ心配しなければならない。 –

+0

一度心配するだけで十分だ。あなたの助けてくれてありがとう:) – Rucia