背景
现在有表一(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更好理解一点。
