oracle中update...select

比如有两张表

USER_CHINESE

ID ZHONGWEN

1 张三

2 李四

3 王五

USER_ENGLISH
ID PINYIN
1 zhangsan
2 lisi
4 liuliu

现在我想让USER_CHINESE表中的汉字变成拼音。

sql语句是:
update USER_CHINESE t1
set t1.zhongwen = (select t2.pinyin from USER_ENGLISH t2 where t2.id = t1.id);

这时候,你可能觉得应该update两条。
可是结果是:3条被更新。

看结果:
USER_CHINESE
ID ZHONGWEN
1 zhangsan
2 lisi
3

真的是更新了三条。
由于id=3的没有匹配上,所以id=3的记录的ZHONGWEN字段改成null了。
所以,这点一定要注意。

记住:如果update或delete没有where条件,则一定是全表更新的。

如果你不想更新id=3的记录。sql语句可以这样写:
update USER_CHINESE t1
set t1.zhongwen = (select t2.pinyin from USER_ENGLISH t2 where t2.id = t1.id)
where t1.id ! = 3;
这个时候结果是:2条被更新。
USER_CHINESE
ID ZHONGWEN
1 zhangsan
2 lisi
3 王五

但是,如果我们每次都在update之前都先找一下匹配不上的id,然后加到where条件中,这样肯定不行。
所以,如果你想让能匹配上的记录更新,匹配不上的记录保持不变。sql语句应该这样写:
update USER_CHINESE t1
set t1.zhongwen = nvl((select t2.pinyin from USER_ENGLISH t2 where t2.id = t1.id),t1.zhongwen);
这个时候结果是:3条被更新。
USER_CHINESE
ID ZHONGWEN
1 zhangsan
2 lisi
3 王五
达到目的了。注意这个时候是3条被更新,不是两条。

猜你喜欢

转载自liumiao2011.iteye.com/blog/1557962