mySQL:如何根据四个字段识别重复项

时间:2012-12-27 11:05:58

标签: mysql

我已经在SO上阅读了一些关于如何删除重复项的帖子,通过将表与其自身的另一个实例进行比较,但是我不想删除我想要比较它们的重复项。

例如。我有“id”,“sold_price”,“bruksareal”,“kommunenr”,“Gårdsnr”,“Bruksnr”,“Festenr”,“Seksjonsnr”等字段。所有字段都是int。

我想识别重复/相同的行(相同的bruksareal,kommunenr,gårdsnr,bruksnr,festenr和seksjonsnr)。如果相同,那么我想给这些行一个唯一的参考号。

我相信这会更容易识别我后来想要在其他字段上比较的行(例如“sold_price”,“sold_date”等等。)

如果您认为我的方法有误,我愿意接受建议......

2 个答案:

答案 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无效)。