日期:2014-05-16  浏览次数:20743 次

(转载)mysql通过关联修改表中两个字段的值

mysql通过关联修改表中两个字段的值

刚刚看到一道数据库的题,觉得挺有意思。

两张表:
A:id,age,column1,column2
B:id,age,column1,column2
A.id 与 B.id关联。
将B中age>40的column1,column2更新到A的相应记录中,只能写一个语句。
写出mysql版本。

?

下面是测试用的脚本:

SQL语句:

create table A (??
??? id????? varchar(1),??
??? column1 varchar(1),??
??? column2 varchar(1),
??? age???? int????
)??
?
create table B (??
??? id????? varchar(1),??
??? column1 varchar(1),??
??? column2 varchar(1),??
??? age???? int?
)?

insert into A(id, column1, column2, age) values ('1', '1', '1', 20);??
insert into A(id, column1, column2, age) values ('1', '1', '1', 21);??
insert into A(id, column1, column2, age) values ('2', '2', '2', 22);??
insert into A(id, column1, column2, age) values ('3', '3', '3', 23);??


insert into B(id, column1, column2, age) values ('1', 'X', 'X', 41);??
insert into B(id, column1, column2, age) values ('2', 'X', 'X', 21);??
insert into B(id, column1, column2, age) values ('3', 'X', 'X', 51);??
insert into B(id, column1, column2, age) values ('3', 'Y', 'Y', 51);?

做完这些操作以后,就要考虑怎么实现了。

开始时候的想法是,

update a

set a.column1 = (select b.column1 from a, b where b.age > 40 and a.id = b.id),

column2 = (select b.column2 from a, b where b.age > 40 and a.id = b.id);

实际上,这样是不好使的。

Error Code : 1093
You can't specify target table 'a' for update in FROM clause
意思是,要修改的表,就不能在后面子查询语句中使用。

?

所以得用其他的方法。

update a inner join b on a.id=b.id??
set A.column1 =b.column1,a.column2=b.column2??
where b.age>40;
这个试了下,很好用。

?

当学习了。就是不知道有没有更好的方法。