上一偏文章写道,使用
1> UPDATE
2> test_to
3> SET
4> test_to.val = test_from.val
5> FROM
6> test_to JOIN test_from
7> ON (test_to.id =test_from.id);
8> go
来进行两个表的复制更新,不额外更新不匹配的数据。
但是这个SQL语句, 在 SQL Server 上面可以运行, 在 Oracle 、 Mysql 上面,好像是不行的。
今天在百度知道上面,就遇到个类似的情况
CREATE TABLE t1 ( id int, name varchar(10), age INT, address varchar(10));
CREATE TABLE t2 ( id int, name varchar(10), age INT, address varchar(10));
INSERT INTO t1 VALUES( 1, '小张', 0, '北京');
INSERT INTO t1 VALUES( 2, '小丽', 0, '上海');
INSERT INTO t1 VALUES( 3, '小花', 0, '云南');
INSERT INTO t1 VALUES( 4, '小刚', 0, '四川');
INSERT INTO t1 VALUES( 5, '小陈', 0, '重庆');
INSERT INTO t2 VALUES(1, '小白', 15, '北京');
INSERT INTO t2 VALUES(2, '大侠', 48, '上海');
INSERT INTO t2 VALUES(3, '小花', 28, '云南');
INSERT INTO t2 VALUES(4, '小刚', 28, '四川');
INSERT INTO t2 VALUES(5, '小陈', 24, '重庆');
INSERT INTO t2 VALUES(6, '小丽', 24, '天津');
说有2张表, t1 t2 , 要把 t2 的 age 字段的数据, 填写到 t1 的 age 字段。
解决办法是, 创建一个视图,关联这2个表。
CREATE VIEW temp_view AS
SELECT
t1.name AS t1Name,
t1.age AS t1Age,
t2.name AS t2Name,
t2.age AS t2Age
FROM
t1, t2
WHERE
t1.name = t2.name
然后直接更新视图。
UPDATE temp_view SET t1Age = t2Age;
mysql> select * from t1;
+------+------+------+---------+
| id | name | age | address |
+------+------+------+---------+
| 1 | 小张 | 0 | 北京 |
| 2 | 小丽 | 24 | 上海 |
| 3 | 小花 | 28 | 云南 |
| 4 | 小刚 | 28 | 四川 |
| 5 | 小陈 | 24 | 重庆 |
+------+------+------+---------+
5 rows in set (0.00 sec)
更新完毕后, t1 表中的 age 被更新了, 如果 t2表中没有对应的数据, 不更新 t1 表的那一行的记录。