0

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

例如。我有字段“id”、“sold_price”、“bruksareal”、“kommunenr”、“Gårdsnr”、“Bruksnr”、“Festenr”、“Seksjonsnr”。所有字段都是整数。

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

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

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

4

2 回答 2

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
于 2012-12-27T11:10:04.070 回答
0

根据您要在哪里执行此操作,我会选择哈希实现。对于每个插入,在您执行插入时计算所需列的哈希(可能会触发),然后您应该能够很容易地找出重复的行(如果您索引该列,查询应该非常快,但请记住,这仍然不是一个 int 列,因此它会随着时间的推移而变慢)。

在此之后,您可以对重复的记录做任何您想做的事情,而无需对数据库进行非常昂贵的查询。

稍后编辑:确保将空值转换为某个定义的值,因为如果操作数为空,某些 mysql 函数(如 MD5)只会返回空值。concat 也是如此——如果一个操作数为 null,它将返回 null(尽管 concat_ws 也是无效的)。

于 2012-12-27T16:08:28.143 回答