2013-03-15 39 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