0

我有一个有趣的 SQL 任务,尽管我会询问社区是否有人知道完成它的快速方法。我有 2 个缓慢的解决方案,但我想知道我是否错过了更快的东西。

这是任务:

给定表 A 中的记录列表,其中一列引用另一个表 B 的主键,从逻辑上讲,尽管这是一个没有外键的 MyISAM,但我们要对表 B 进行重复数据删除,并更新表 A使用表 B 中的规范去重值,然后从表 B 中删除除规范 id 记录之外的所有记录。

通过一个小例子可能更容易说明这一点。假设表 A 是人员表,表 B 是城市表。还可以说 city 表中的记录是重复的并且需要重复数据删除。假设表 B 的第 1 行和第 2 行都指的是洛杉矶。

然后在 person 表中,我们要更新 Los Angeles 中城市 id 为 2 的所有人员,使其城市 id 为 1,并从城市 id 为 2 的城市表中删除重复值。

可能有许多这样的行代表重复值,而不仅仅是 2,你明白了。现在,我正在查询 city 表中的所有城市,将它们分组为等价类,循环遍历每个等价类,在这种情况下指定规范版本,只需选择第一个,并执行 2 个查询,更新和删除:

update person set city_id = $canonical_city_id where city_id in ($list_of_dupes)

然后

delete from city where city_id in ($list_of_dupes) and city_id != $canonical_city_id

我认为可能有一种更快的方法,因为我们不在乎哪个 id 是规范的,它可能是第一个、in 或随机的,都没有关系。你能想出一种方法在 1 个 SQL 语句中完成整个工作吗?你认为最快的方法是什么?

4

0 回答 0