2013-03-15 62 views
-1

我有一些需要清理的损坏数据。考虑到数据的当前状态,我怎么能做到这一点?更新不正确的外键?

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

冗余房项目: Rooms 通讯分享条目: enter image description here

如何让所有的Share.room_id的角度,从房间表相同的进入?我尝试过各种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 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

那么,什么是在房间的唯一关键?显然它不是ID - 这显然只是一个(无用的)合成主键。那么,我们如何才能知道ROOMS中的哪些行是duff和哪些是犹太洁食? – APC 2013-03-15 15:22:12

+0

嗡嗡声。我的道歉,我不认为我的回应会回答你的问题。 Room中的外键Addition_Id指向Building_Addition表中的条目。 Building_Addition表具有对建筑物表格的引用。但是,我并不关心使用哪个匹配的房间条目。 – Ken 2013-03-15 16:05:10

+0

我确实忽略了我发布的示例数据中的列。房间表中有一个permanent_id列。 – Ken 2013-03-15 16:21:09

回答

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); 
+0

谢谢。我能够使这个查询的变体工作。 – Ken 2013-03-15 18:01:58