更新错误的外键?

时间:2013-03-15 14:34:37

标签: sql oracle oracle11g

我有一些需要清理的损坏数据。考虑到当前的数据状态,我该如何实现这一目标?

Share表包含引用Room表的外键。目前Room表中有重复项。应该是许多股票指向一个房间的情况。但是,情况是每个共享的房间表中都有一个条目。房间条目相同,我希望删除冗余条目。显然,首先要做的是更正Share表中的引用。

冗余房间条目: Rooms 相应的股票分录: enter image description here

如何让所有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);

它非常慢,可能非常低效,但它只需要运行一次。

1 个答案:

答案 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);