以前的DBA管理了一个具有2.4M条目的非关系表,所有条目都具有唯一ID。但是,每条记录中都有重复的记录,其中包含不同的数据,例如:
+---------+---------+--------------+----------------------+-------------+
| id | Name | Address | Phone | Email | LastVisited |
+---------+---------+--------------+---------+------------+-------------+
| 1 | bob | 12 Some Road | 02456 | | |
| 2 | bobby | | 02456 | bob@domain | |
| 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列 - 这只是为了说明
我知道如何识别重复项,在这种情况下我正在使用电话号码。我已将重复内容提取到一个单独的表中 - 总共有730k的内容。
合并这些记录(并标记不需要的删除记录)的最有效方法是什么?
我已经看过将UPDATE与INNER JOIN一起使用,但是需要几个WHERE子句,因为我想用后续记录中的数据更新第一个记录,其中后续记录具有前一记录所没有的附加数据。 / p>
我看过第三方软件,例如Fuzzy Dups,但如果可能,我想要一个纯MySQL选项
最终目标是,我会留下类似的东西:
+---------+---------+--------------+----------------------+-------------+
| id | Name | Address | Phone | Email | LastVisited |
+---------+---------+--------------+---------+------------+-------------+
| 1 | bob | 12 Some Road | 02456 | bob@domain | 2010-07-13 |
+---------+---------+--------------+---------+------------+-------------+
我应该看一下存储过程/函数的循环,还是我错过了一些非常简单的事情?
答案 0 :(得分:1)
你必须创建一个PROCEDURE,但在此之前 创建你自己的temp_table,如:
Insert into temp_table(column1, column2,....) values (select column1, column2... from myTable GROUP BY phoneNumber)
你必须创建上面提到的物理表,以便你可以在其上运行游标。
创建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,其中包含的值为
Insert into similar_tempTable(column1, column2,....) values (Select column1, column2,.... from myTable where phoneNumber=L_phoneNumber)
下一步是从similar_tempTable中提取你想要的每一列的值,并更新到myTable的行,其中id = L_id,并从myTable中删除其余的重复行。
还有一件事,在每次迭代游标后截断similar_tempTable ......
希望这会对你有所帮助......