我有一个有趣的SQL任务,虽然我会问社区是否有人知道快速实现它的方法。我有两个缓慢的解决方案,但我想知道我是否错过了更快的东西。
这是任务:
给定一个表中的记录列表,表A,其中一列引用另一个表的主键,表B,从逻辑上讲,虽然这是一个没有外键的MyISAM,但我们想要重复数据删除表B,更新表A使用表B中的规范重复数据删除值,然后从表B中删除除规范id记录之外的所有值。
通过一个小例子可以更容易地说明这一点。假设表A是人表,表B是城表。让我们说城市表中的记录是重复的,需要重复删除。让我们说表B的第1行和第2行都是指洛杉矶。
然后在人员表中,我们想要更新洛杉矶城市ID为2的所有人,城市ID为1,并从城市ID中删除城市表中的重复值。
可能有很多这样的行代表重复的值,而不只是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语句中完成整个工作的方法吗?您认为最快的方式是什么?