我有一些需要清理的损坏数据。考虑到当前的数据状态,我该如何实现这一目标?
Share表包含引用Room表的外键。目前Room表中有重复项。应该是许多股票指向一个房间的情况。但是,情况是每个共享的房间表中都有一个条目。房间条目相同,我希望删除冗余条目。显然,首先要做的是更正Share表中的引用。
冗余房间条目: 相应的股票分录:
如何让所有Share.room_id指向Room表中的相同条目?我尝试了各种Update语句但没有成功。以下Update语句没有意义,因为我指定了Room条目,当然这不起作用。但我必须以某种方式关闭Room表上的联接。
UPDATE share s
SET room_id = (SELECT DISTINCT MIN(s.room_id) FROM room r
WHERE s.room_id = r.id
GROUP BY ROLLUP(r.addition_id, r.area, r.first_effective_at))
任何建议都将不胜感激。提前谢谢。
只想发布适合我的Update语句:
UPDATE share s
SET room_id = (SELECT MIN(r.id) FROM room r
JOIN room r2
ON (r.addition_id = r2.addition_id
AND r.area = r2.area
AND r.first_effective_at = r2.first_effective_at
AND r.permanent_id = r2.permanent_id)
WHERE r2.id = s.room_id
GROUP BY r.addition_id, r.area, r.first_effective_at, r.permanent_id);
它非常慢,可能非常低效,但它只需要运行一次。
答案 0 :(得分:1)
也许这样,未经测试:
update share s
set room_id =
(select min(r.id)
from room r
join
(select addition_id, area, first_effective_at
from room
where s.room_id = id)
as r2
on r.addition_id = r2.addition_id and r.area = r2.area and r.first_effective_at = r2.first_effective_at
group by r.addition_id, r.area, r.first_effective_at);