我有一个100多万条记录的列表,我需要找到重复的记录,并更改列的值,标记它们,不删除行,但也保留其他列的值。例如:
id email addr city state zip phone active
1 me@me.com 1234 Street Denver, CO 80012 123-555-6789 1
2 me@me.com BLANK BLANK BLANK, CO BLANK BLANK 1
所以我需要保持第1行的列值,并将第2行的活动字段切换为0,而不删除它。这在MySQL是可行的吗?需要有点快,否则它会崩溃的盒子,有100万+行。我可以用PHP,但如果可能的话,MySQL会更好。
如果唯一决定唯一性的是列电子邮件(正如您的示例所建议的),那么试试这个:
Update t set active= 0
From Table t
Where id !=
(Select Min(id) From table
Where email = t.email)
如果还应该使用其他列来确定唯一性,则在子查询where子句中包括这些列:
Update t set active= 0
From Table t
Where id !=
(Select Min(id) From table
Where email = t.email
And addr = t.addr
And [Other columns])
要处理评论中的问题,如果有空白字段,并且您希望从多行收集数据,则问题要复杂得多。首先,可能有不止一行具有值,并且某些行与其他行可能不同。其次,如果您希望仅在填充它们时才将它们包含在惟一性(重复项)测试中,那么当某些行具有相同的三列,而另一组行具有具有相同值的另一组列时该怎么办?
id addr city state zip phone
1 X Denver CO 71113 Blank
2 Y Blank CO Blank 212.901-3456
3 X Denver TX Blank Blank
4 Y ElPaso TX Blank 212.901-3456
5 X ElPaso Blank 71113 Blank
6 Y ElPaso Blank Blank 212.901-3456
如何确定哪些行是重复的?这太复杂了,难以处理。如果你能解决一组固定的列用于确定uniquenses/dupllicates,然后有一个方法可以收集其他列的数据值从一个其他的多行这你是当你离开积极的空白值,但如果列用于确定独特性/副本可以是不同的,(取决于实际的数据值),那么这些技术不会工作。