-1

我有一些损坏的数据需要清理。鉴于数据的当前状态,我该如何做到这一点?

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

冗余房间条目: 房间 对应的共享条目: 在此处输入图像描述

如何使所有 Share.room_id 指向 Room 表中的同一条目?我尝试了各种更新语句但没有成功。下面的 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);

它超级慢,可能效率极低,但它只需要运行一次。

4

1 回答 1

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);
于 2013-03-15T16:17:19.623 回答