背景
现在有表一(goods):
no | sn |
---|---|
1 | aaa |
2 | bbb |
3 | ccc |
4 | ddd |
我们发现其中sn字段有写值存在错误,需要批量更新,比如我们需要把表一中的bbb,ccc变成xxx,zzz。
所以在临时表test中插入对应的变换关系:
临时表(test):
before | after |
---|---|
bbb | xxx |
ccc | zzz |
解决办法
由于oracle中没有update … set … from … 的结构,所以得用子查询的办法解决。
方法一:
1
update goods g set g.sn = (select t.after from test t where t.before = g.sn) where exists (select t.before from test t where t.before = g.sn)
这里需要注意的是,必须加上
where exists
条件,否则会因为有些值并不在更新范围而导致执行报错:1
ORA-01407: 无法更新("GOODS"."SN")为NULL
方法二:
1
update goods g set g.sn = (select t.after from test t where t.before = g.sn) where g.sn in (select t.before from test t where t.before = g.sn)
拓展
这里方法一中用了exists
的方法用来判断哪些需要更新,哪些不需要更新,是一个内建方法。而方法二使用in
来判断。
通常情况下exists
的效率会比in
的效率高,主要因为exists
使用了索引技术而in
没有。不过数据不大的情况下,差距也不大,相对来说in
更好理解一点。