0

私は興味深い SQL タスクを持っていますが、それを達成するための迅速な方法を誰かが知っているかどうかコミュニティに尋ねます。私は2つの遅い解決策を持っていますが、もっと速いものを見逃しているのではないかと思っています.

タスクは次のとおりです。

テーブル A 内のレコードのリストがあり、別のテーブル B の主キーを参照する列があり、これは外部キーのない MyISAM ですが、論理的に言えば、テーブル B の重複を排除し、テーブル A を更新したいと考えています。テーブル B から正規の重複排除された値を使用し、テーブル B から正規 ID レコードを除くすべてを削除します。

これは、小さな例で簡単に説明できます。テーブル A が person テーブルで、テーブル B が city テーブルだとします。また、city テーブルに重複していて重複排除が必要なレコードがあるとします。テーブル B の行 1 と行 2 の両方がロサンゼルスを参照しているとします。

次に person テーブルで、都市 ID が 2 の Los Angeles のすべての人物を更新して都市 ID を 1 にし、都市 ID が 2 の都市テーブルから重複値を削除します。

2 つだけでなく、重複した値を表すこのような行が多数ある可能性があります。現在、都市テーブルからすべての都市をクエリして、それらを等価クラスにグループ化し、各等価クラスをループし、この場合は正規バージョンを指定して、最初のものを選択し、更新と削除の 2 つのクエリを実行しています。

update person set city_id = $canonical_city_id where city_id in ($list_of_dupes)

それで

delete from city where city_id in ($list_of_dupes) and city_id != $canonical_city_id

どの id が正規のものであるかは気にしないので、より高速な方法があると思います。最初の id、in の id、またはランダムな id は関係ありません。この作業全体を 1 つの SQL ステートメントで行う方法を考えられますか? 最速の方法は何だと思いますか?

4

0 に答える 0