在看《MySQL 5.1参考手册》的时候,发现MySQL提供了一种两表关联update操作。原文如下:
UPDATE items,month SET items.price=month.price WHERE items.id=month.id;
在MySQL中构造表验证了一下
mysql> select * from test; +------+--------+ | id | salary | +------+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +------+--------+ 3 rows in set (0.00 sec) mysql> select * from test1; +------+--------+ | id | salary | +------+--------+ | 1 | 400 | | 2 | 500 | +------+--------+ 2 rows in set (0.00 sec) mysql> update test,test1 set test.salary=test1.salary where test.id=test1.id; Query OK, 2 rows affected (0.00 sec) Rows matched: 2 Changed: 2 Warnings: 0 mysql> select * from test; +------+--------+ | id | salary | +------+--------+ | 1 | 400 | | 2 | 500 | | 3 | 300 | +------+--------+ 3 rows in set (0.00 sec)
不难看出,上述两表关联update中只更新了test中id为1和id为2的行。
UPDATE items,month SET items.price=month.price WHERE items.id=month.id 类似于UPDATE items inner join month on items.id=month.id SET items.price=month.price
如果 inner改为left
UPDATE items left month on items.id=month.id SET items.price=month.price 匹配不到的items.price值会更新为空,此更新语句类似于
UPDATE items SET items.price=(select month.price from month where items.id=month.id ),因此匹配不到的且不想为空时,此语句是有问题的达不到
匹配不到的且不想为空保存原值的目的,切记
寻思了一下,Oracle中好像并没有提供两表关联的update操作,同样输入了上述语句,Oracle报错,报错信息如下:
SQL> update test,test1 set test.salary=test1.salary where test.id=test1.id;
update test,test1 set test.salary=test1.salary where test.id=test1.id
*
第 1 行出现错误:
ORA-00971: 缺失 SET 关键字
后来,查了查官方文档,这种语法并不支持,那么Oracle中如何实现MySQL中的这种效果呢?
鼓捣了一下,虽然出来了,但还是略为复杂。
SQL> update test set test.salary=(select salary from test1 where test1.id=test.id)
where exists (select 1 from test1 where test1.id=test.id); 已更新2行。 SQL> select * from test; ID SALARY ---------- ---------- 1 400 2 500 3 300
