如何使用mysql join更新记录?

时间:2012-03-02 11:22:10

标签: mysql sql

在我的mysql中我有t1,t2表,我想根据t1的字段值匹配t2的字段值从t2的字段值更新t1的字段

我尝试了以下但它没有更新。我在这里做错了什么

UPDATE t1 
INNER JOIN t2 
ON t1.name = t2.name 
SET t1.age = t2.age 
WHERE t1.name IS NOT NULL;

4 个答案:

答案 0 :(得分:2)

您需要将要更新的表与查询表分开,即使它是相同的:

UPDATE t1  
SET t1.age = t2.age
FROM t1 as tempT1
INNER JOIN t2 
ON tempT1.name = t2.name 
WHERE tempT1.name IS NOT NULL;

<强>更新
显然MySQL正在使用与其他数据库不同的UPDATE JOIN语法。您的初始查询似乎使用了正确的语法,只是为了确保尝试对表名进行别名:

UPDATE t1 temp1
INNER JOIN t2 temp2
ON temp1.name = temp2.name 
SET temp1.age = temp2.age 
WHERE temp1.name IS NOT NULL;

更新2
看了这一点后,我确定WHERE条款是问题:
WHERE temp1.name IS NOT NULL
无论如何,您无法加入空值,因此默认情况下会过滤掉它们。 WHERE子句以某种方式干扰了连接 尝试删除它以查看UPDATE是否有效。如果您不想立即执行和更新,只需执行具有相同JOIN CLAUSE的选择即可查看哪些记录会受到影响。

以下是NULLJOIN的一般参考:
http://databases.about.com/library/weekly/aa051203a.htm

以下是符合上述内容的SQL Server参考:http://msdn.microsoft.com/en-us/library/ms190409.aspx

无法找到明确说明这一点的MySQL引用,但我认为对于所有关系数据库都是如此。

答案 1 :(得分:1)

我自己也找到了实现同样方案的另一种方法。我在这里粘贴答案,以便其他人获益。

UPDATE t1 SET t2_age = (SELECT age FROM t2 BINARY WHERE name = t1.name);

答案 2 :(得分:0)

试试这个:

update t1
set t1.age = t2.age
from t1
inner join t2 on t1.name = t2.name
where t1.name is not null

答案 3 :(得分:0)

试试这个

UPDATE t1,t2  
SET t1.age = t2.age
FROM t1 as tempT1
INNER JOIN t2 ON tempT1.name = t2.name 
WHERE tempT1.name IS NOT NULL;