2009-10-16 120 views
-1

我有mySQL数据库与一些重复的条目。他们有相同的外地电话。但他们也有不同的领域。例如,我有两个相同的电话条目,但第一个条目的评级字段= default_value和第二个条目的评级字段= 5.因此,我必须合并此条目,然后删除重复...合并然后删除重复条目

更常见的示例:

entry1.phone==123 
entry1.phone==etry2.phone 
    entry1.rating!=entry2.phone 
    entry1.rating==default_value(0) 
    entry2.rating==5 
    merge 
    entry1.phone==123 
    entry1.rating==5 
    entry2 is deleted 
+0

你在问什么? – 2009-10-16 10:56:40

+0

我在问如何做到这一点... SQL查询或存储例程... – Oleksandr 2009-10-16 11:02:01

+2

但你会如何确定你将删除哪条记录? (除非它们是完全重复的,但是你问的方式表明它们不是......) – 2009-10-16 11:11:00

回答

1

听起来好像你并不真的需要合并任何记录,如果你只是想更新与非违约评级的第一条记录。我认为你可以删除任何默认评级的记录。

Select a.* 
from tbl a 
inner join tbl b 
on a.Phone = b.Phone 
    and a.Rating < b.Rating 


Delete a 
from tbl a 
inner join tbl b 
on a.Phone = b.Phone 
    and a.Rating < b.Rating 

如果你真的需要更新的第一条记录和删除第二个记录,你可以,如果你有一个自动增量ID做类似的事情。下一个例子是我会做什么来更新第一条记录,如果存在一个ID。如果您只有一次重复的电话号码,这是唯一可靠的。

Update a 
Set a.Rating = b.Rating 
from tbl a 
inner join tbl b 
on a.Phone = b.Phone 
    and a.Rating < b.Rating 
    and a.ID < b.ID 


Delete a 
from tbl a 
inner join tbl b 
on a.Phone = b.Phone 
    and a.Rating = b.Rating 
    and b.ID > a.ID 

希望这会有所帮助。

-Ranthalion

2

我不认为你可以在SQL中有效地做到这一点。一种缓慢的方法是这样的:

CREATE TEMPORARY TABLE tmp_table (...); 
INSERT INTO tmp_table SELECT phone, max(rating) FROM table GROUP BY phone; 
TRUNCATE table; 
INSERT INTO table SELECT * FROM tmp_table; 

更好的方法是存储过程或外部脚本。从phone订购表中选择所有行,做分组/合并/手动删除(迭代的结果,从以前的行比作phone价值,如果它是不同的,你有一个新的组,等等)。在MySQL中编写存储过程很痛苦,所以我不会为你编写代码。 :)