我已经在SO上阅读了一些关于如何删除重复项的帖子,通过将表与其自身的另一个实例进行比较,但是我不想删除我想要比较它们的重复项。
例如。我有“id”,“sold_price”,“bruksareal”,“kommunenr”,“Gårdsnr”,“Bruksnr”,“Festenr”,“Seksjonsnr”等字段。所有字段都是int。
我想识别重复/相同的行(相同的bruksareal,kommunenr,gårdsnr,bruksnr,festenr和seksjonsnr)。如果相同,那么我想给这些行一个唯一的参考号。
我相信这会更容易识别我后来想要在其他字段上比较的行(例如“sold_price”,“sold_date”等等。)
如果您认为我的方法有误,我愿意接受建议......
答案 0 :(得分:1)
在所有字段中对表自身执行连接,然后使用exists
查询,例如:
Update Table1
Set reference = UUID()
Where exists (
Select tb1.id
from Table1 tb1 inner join Table1 tb2 on
tb1.Field1 = tb2.Field1 AND
tb1.Field2 = tb2.Field2 AND
etc
Where tb1.Id = Table1.Id
And tb1.Id != tb2.Id
)
实际上你只需加入就可以简化
Update Table1
Set reference = UUID()
From Table1 inner join Table1 tb2 on
Table1.Field1 = tb2.Field1 AND
Table1.Field2 = tb2.Field2 AND
etc
Where Table1.Id != tb2.Id
答案 1 :(得分:0)
根据你想要做的那样,我会去做哈希实现。对于每个插入,在执行插入时计算所需列的哈希值(可能是触发器),之后您应该能够非常容易地找到哪些行是重复的(如果您索引该列,查询应该非常快,但请记住,这仍然不是一个int列,因此随着时间的推移它会变慢一些)。
在此之后,您可以使用重复的记录随意执行任何操作,而无需对数据库进行非常昂贵的查询。
稍后编辑:确保将空值转换为某个定义的值,因为如果操作数为null,某些mysql函数(如MD5)将返回null。 concat也是如此 - 如果一个操作数为null,它将返回null(虽然相同但对concat_ws无效)。