oracle中update.select
oracle中update...select比如有两张表?USER_CHINESEIDZHONGWEN1张三2李四3王五?USER_ENGLISHIDPINYIN1zhan
oracle中update...select
比如有两张表
?
USER_CHINESE
IDZHONGWEN
1张三
2李四
3王五
?
USER_ENGLISHIDPINYIN1zhangsan2lisi4liuliu
现在我想让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_CHINESEIDZHONGWEN1zhangsan2lisi3
真的是更新了三条。由于id=3的没有匹配上,所以id=3的记录的ZHONGWEN字段改成null了。所以,这点一定要注意。
记住:如果update或delete没有where条件,则一定是全表更新的。
如果你不想更新id=3的记录。sql语句可以这样写:update USER_CHINESE t1set t1.zhongwen = (select t2.pinyin from USER_ENGLISH t2 where t2.id = t1.id)where t1.id ! = 3;这个时候结果是:2条被更新。USER_CHINESEIDZHONGWEN1zhangsan2lisi3王五
但是,如果我们每次都在update之前都先找一下匹配不上的id,然后加到where条件中,这样肯定不行。所以,如果你想让能匹配上的记录更新,匹配不上的记录保持不变。sql语句应该这样写:update USER_CHINESE t1set t1.zhongwen = nvl((select t2.pinyin from USER_ENGLISH t2 where t2.id = t1.id),t1.zhongwen);这个时候结果是:3条被更新。USER_CHINESEIDZHONGWEN1zhangsan2lisi3王五达到目的了。注意这个时候是3条被更新,不是两条。