有效地将table2中的值合并到table1中

时间:2013-03-10 20:37:22

标签: mysql

请查看以下SQLFiddle以供参考:http://sqlfiddle.com/#!2/f02ca/1

我有两张几乎相同的牌桌。我想确定表数据之间的差异,用另一个表中的不同数据更新一个表。

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

所以我想用table2中的新some_id来更新table1。我可以很容易地找到两个表之间的差异:

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

我在这里走在正确的轨道上吗?如果是这样,我该如何解决这个问题?是否有更好或更有效的方法来实现这一目标?

一对夫妇注意到:

  1. 由于table1列,我不仅要更新或插入从timestamptable1的所有内容,这一点很重要。更新行时,该列将自行更新。我希望在some_id中更新的唯一行是table2timestamp不同的行。基本上,{{1}}列用于显示上次更改该行的时间。
  2. 重要的是,这是在尽可能少的查询中完成的,并且它们是有效完成的。在我这里的简单示例中,每个表只有5行,但实际上我的表有数千行。

2 个答案:

答案 0 :(得分: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语句中的连接相同,除了它不需要是外连接,因为据我所知,您只想更新id匹配的行。

以下是此查询的SQL小提琴演示:http://sqlfiddle.com/#!2/58eb8/1

答案 1 :(得分:0)

我不敢。在MySQL中,无法修改完成SELECT的同一个表。

检查以下内容:http://dev.mysql.com/doc/refman/5.6/en/update.html

  

目前,您无法更新表并从子查询中的同一表中进行选择。