MySQLデータベース内の重複する外部キー行の削除

私は Stores テーブルと Schools
テーブルを持っています。これは1対多の関係です。複数の学校が同じ店舗でサービスされることができますが、その逆もありません。

先ほどの開発では、同じストアを Stores
データベースで何度も繰り返していたのです。私は次のような行を挿入した:

Store_ID| Store_URL
1       | http://sameurl.com
2       | http://sameurl.com

2つの異なる学校が同じ店舗にある場合は、ある学校行で 1 を参照し、別の学校行で
2 を参照します。

Store_URLGROUP BY を使用し、重複を識別するために
COUNT()を使用することで、簡単に重複を識別できます。

私より前の難しい課題は、すべての学校が重複していない店舗を指していることです。重複した
Stores を単に削除すると、存在しない行を指す Schools
が表示されます。

重複をなくし、同じ店舗を共有する学校を同じ店舗の行にするにはどうすればよいですか?

注:数千の学校や店があります。手動のソリューションは動作しません。

ベストアンサー

あなたの言ったことから、あなたの School テーブルに store_ID
があるとします。

まず、それぞれの複製物を把握することから始めます。保存する store_ID
私はまたあなたがそれが最も低いID値であることを望んでいると仮定します。次に、 School
store_ID を、現在のURLの
MIN(store_ID)に更新します。その後、余分な store_ID
レコードを削除する必要があります

これは私がアップデートについてどうやって行くのかです:

UPDATE sch
SET sch.Store_ID = matcher.store_ID
FROM Schools AS sch
INNER JOIN Stores AS st ON sch.store_ID = st.store_ID
INNER JOIN
(
   SELECT MIN(st.store_id) AS store_ID, store_url
   FROM Schools AS sch
   INNER JOIN Stores AS st ON sch.store_ID = st.store_ID
   GROUP BY Store_URL
) AS matcher ON st.Store_URL = matcher.Store_Url
   AND st.Store_ID != matcher.store_ID

学校に所属していない店舗を削除できる場合は、次のクエリで追加の行が削除されます。

DELETE FROM st
FROM Stores AS st
LEFT JOIN Schools AS sch ON st.Store_ID = sch.Store_Id
WHERE sch.Store_id IS NULL

ストアの重複レコードのみを削除する場合は、上記の代わりにこのクエリを見てみましょう:

DELETE FROM st
FROM Stores AS st
INNER JOIN
(
   SELECT MIN(st.store_ID) store_Id, st.Store_Url
   FROM Stores AS st
   GROUP BY st.Store_URL
) AS useful ON st.Store_Url = useful.Store_URL
WHERE st.Store_ID != useful.store_Id

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です