我有一张桌子'导演'和另一张表' company_directors'
在导演表格中有重复的记录,其中包含相同的"全名",我想选择最长的"地址"。
我想更新外键" directorID"在' company_directors'表
我曾尝试使用GROUP BY,但我无法指定要保留哪些副本...我也不知道如何更新外键记录以反映所选的' DIRECTOR_ID'重复。
我已经能够通过改变“导演”来将重复记录标记为非活动状态。表并添加“活跃”表格柱。
但是我仍然想要更正" company_directors'表,在删除非活动/重复记录之前。
答案 0 :(得分:0)
如果您想就地执行此操作,请先更新第二个表。
update company_directors cd join
directors d
on cd.DirectorId = d.DirectorId join
(select fullname,
substring_index(group_concat(directorId order by length(Address) desc), ',', 1) as newDirectorId
from directors
group by fullname
) dnew
on d.fullname = dnew.fullname
set cd.DirectorId = dnew.newDirectorId
where dnew.newDirectorId = d.DirectorId;
然后,通过删除不感兴趣的导演来更新directors
:
delete cd
from directors d left join
cd.DirectorId = d.DirectorId join
(select fullname,
substring_index(group_concat(directorId order by length(Address) desc), ',', 1) as newDirectorId
from directors
group by fullname
) dnew
on d.fullname = dnew.fullname and d.directorId = dnew.newDirectorId
where dnew.newDirectorId is null;
我对此方法并不感到兴奋,因为newDirectorId
(在两个查询中)最终都是字符串而不是数字。但是,MySQL不支持窗口函数,因此这可能是最简单的方法。
那就是说,我鼓励你采取略微不同的方法。首先,在执行任何操作之前备份表。
然后,添加一个表示记录是否有效的标志,而不是从directors
删除。然后,使用较短地址的记录无效。调查结果,以确保它们是你想要的。手动更改不正确的标志。然后,返回company_directors
表并修复指向非活动记录的记录。