2

参考のために次の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

私はここで正しい方向に進んでいますか?もしそうなら、どうすればこの問題を回避できますか?これを達成するためのより良いまたはより効率的な方法はありますか?

いくつかのメモ:

  1. 列があるため、からすべてtable2を更新または挿入するだけではないことが重要です。その列は、行が更新されると自動的に更新されます。更新したい行は、で異なる行だけです。つまり、基本的に、その行が最後に変更されたのはいつかを示す列があります。table1timestamptable1some_idtable2timestamp
  2. これは可能な限り少ないクエリで実行され、効率的に実行されることが重要です。ここでの私の簡単な例では、テーブルごとに5行しかありませんが、実際には、私のテーブルには何千もの行があります。
4

2 に答える 2

1

おそらく、JOINを使用したUPDATEが必要です。

UPDATE     table1 AS t1
INNER JOIN table2 AS t2
ON         t1.id = t2.id
SET        t1.some_id = t2.some_id
WHERE      t1.some_id != t2.some_id
;

結合は基本的にSELECTステートメントと同じですが、外部結合である必要はありません。これは、私が理解しているように、idsが一致する行のみを更新する必要があるためです。

このクエリのSQLFiddleデモは次のとおりです:http ://sqlfiddle.com/#!2/58eb8/1 。

于 2013-03-10T21:26:44.837 に答える
0

残念ながら、そうではありません。MySQLでは、SELECTが実行されるのと同じテーブルを変更することはできません。

これらを確認してください:http://dev.mysql.com/doc/refman/5.6/en/update.html

現在、テーブルを更新して、サブクエリで同じテーブルから選択することはできません。

于 2013-03-10T20:51:07.897 に答える