-1

クリーニングが必要な破損データがあります。データの現在の状態を考えると、どうすればこれを達成できますか?

Share テーブルは、Room テーブルを参照する外部キーを保持します。現在、Room テーブルに重複があります。多数の共有が 1 つのルームを指している場合がこれに当てはまります。ただし、各共有の Room テーブルにエントリがあるという状況です。部屋のエントリは同一であり、冗長なエントリを削除したいと考えています。明らかに、最初に行うことは、共有テーブル内の参照を修正することです。

冗長ルーム エントリ: 部屋 対応する共有エントリ: ここに画像の説明を入力

すべての Share.room_id が Room テーブルの同じエントリを指すようにするにはどうすればよいですか? さまざまな Update ステートメントを試みましたが、成功しませんでした。Room エントリを指定しているため、次の Update ステートメントは意味がありません。これはもちろん機能しません。しかし、どうにかして 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 回だけです。

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 に答える