参考のために次のSQLFiddleを見てください:http ://sqlfiddle.com/#!2/f02ca/1
ほぼ同じテーブルが2つあります。テーブルデータの違いを確認したいのですが、一方のテーブルをもう一方のテーブルとは異なるデータで更新します。
table1
|| *id* || *some_id* || *timestamp* ||
|| 1 || A || 01:00 ||
|| 2 || B || 02:00 ||
|| 3 || B || 01:00 ||
|| 4 || A || 02:00 ||
|| 5 || A || 03:00 ||
table2
|| *id* || *some_id* ||
|| 1 || B || <-- some_id is different than table1
|| 2 || B ||
|| 3 || B ||
|| 4 || A ||
|| 5 || B || <-- some_id is different than table1
some_id
そこで、table2の新しいものでtable1を更新したいと思います。2つのテーブルの違いを簡単に見つけることができます。
SELECT t2.id
FROM table2 t2
LEFT JOIN table1 t1 ON t1.id = t2.id
WHERE t2.some_id != t1.some_id
結果:
1, 5 (the id's of the table2 rows that have a different some_id).
私はこのタイプのクエリを実行できると思いました:
UPDATE table1
SET some_id =
(SELECT some_id FROM table2 WHERE id IN
(SELECT t2.id
FROM table2 t2
LEFT JOIN table1 t1 ON t1.id = t2.id
WHERE t2.some_id != t1.some_id ))
table1
クエリはからの新しいsome_id
'で更新されると思いましたが、それらの間で場所が異なるtable2
行に対してのみです。some_ids
しかし、次のエラーが発生します。
SQL Error (1093): You can't specify target table 'table1' for update in FROM clause
私はここで正しい方向に進んでいますか?もしそうなら、どうすればこの問題を回避できますか?これを達成するためのより良いまたはより効率的な方法はありますか?
いくつかのメモ:
- 列があるため、からすべて
table2
を更新または挿入するだけではないことが重要です。その列は、行が更新されると自動的に更新されます。更新したい行は、で異なる行だけです。つまり、基本的に、その行が最後に変更されたのはいつかを示す列があります。table1
timestamp
table1
some_id
table2
timestamp
- これは可能な限り少ないクエリで実行され、効率的に実行されることが重要です。ここでの私の簡単な例では、テーブルごとに5行しかありませんが、実際には、私のテーブルには何千もの行があります。