web-dev-qa-db-ja.com

Mysql:サブクエリでクエリを更新する

こんにちは私は次のクエリを実行する必要があります

クエリ

update Taxonomy
set sourceId = (
select id from TaxonomyMapping a where a.oldId = 
    (
        select cm.en_ID
        from TaxonomyMapping ta 
        join CategoryMapping cm on ta.oldId = cm.language_ID where ta.oldId = oldId limit 1
    ) 
) where id > -1;

テーブルは次のとおりです:

分類(id、oldId、sourceId、name、language)

TaxonomyMapping(id、oldId、sourceId、name、language)分類の完全なコピー

CategoryMapping(en_ID、language_ID)

達成しようとしていること元の分類表には、特定の言語のカテゴリがあり、その翻訳がありますが、カテゴリマッピングでそれらが知られている必要があるため、sourceIdに英語の翻訳を追加する必要があります、これで誰かが私を助けてくれますか?現時点では、使用するoldId(ta.oldId = oldId)が更新するテーブルのoldIdではないことを疑って、すべてのIDを埋めています。このようなクエリを実行することは可能ですか、または別のソリューションを検索する必要がありますか?

2
user1169526

問題は、テーブルが実際に相互にどのように関連付けられるかについては不明です。

投稿したクエリが機能していないため、ロジックのどの要素にエラーが含まれているかを判別することは困難であり、「oldID」と呼ばれる列では、必要な結合ロジックを理解するのが困難です。

私は、最も内側のクエリから最も外側のクエリに理解しようとすることに基づいて、クエリを解釈して書き直そうとしましたが、これはあなたが達成しようとしていることのようです。

私のテーブル "ta"はあなたのテーブル "ta"がやろうとしているのと同じことをやっていて、私のテーブル "a"はあなたのテーブル "a"がやろうとしているのと同じことをやっています。先に述べたように、私があなたのクエリを正しく理解していれば、元のクエリは裏返しに書かれているように見えるので、それらはクエリでの出現順序が逆になります。

UPDATE Taxonomy t
  JOIN TaxonomyMapping ta ON ta.oldID = t.oldID
  JOIN CategoryMapping cm ON cm.language_ID = ta.oldID
  JOIN TaxonomyMapping a ON a.oldID = cm.en_id
   SET t.sourceId = a.id
 WHERE t.id > -1;

ただし、「TaxonomyMapping」テーブルと「Taxonomy」テーブルが「完全なコピー」(同じデータを含む)である場合、テーブル「ta」は不要であり、実際に必要なのは次のものだけです。

UPDATE Taxonomy t
  JOIN CategoryMapping cm ON cm.language_ID = t.oldID
  JOIN TaxonomyMapping a ON a.oldID = cm.en_id
   SET t.sourceId = a.id
 WHERE t.id > -1;

実際、永続的なコピーがなくてもできるように思えます。

UPDATE Taxonomy t
  JOIN CategoryMapping cm ON cm.language_ID = t.oldID
  JOIN (SELECT * FROM Taxonomy) x ON x.oldID = cm.en_ID
   SET t.sourceId = x.id
 WHERE t.id > -1;

最後の例が機能するのは、残りのクエリを実行する前に、サーバーがテーブル "x"と呼ばれる "Taxonomy"の一時コピーを具体化するためです。そうすることで、同じテーブル内の他の場所から選択したデータでテーブルを更新できますが、通常はできません...しかし、コピーは厳密には別のテーブルなので、機能します。一時的なコピーは通常メモリ内に作成され、サイズが大きいことが判明した場合はディスクに移動されますが、いずれにしても、クエリが完了するとすぐに自動的に削除されます。欠点は、新しいテーブルにはインデックスがないため、このアプローチは無制限にスケーリングされないことですが、元の相関サブクエリよりも高速である必要があります。

もちろん、私が必要なロジックを理解していなければ、これらはどれも機能しません。

3