oracle中的两表更新

背景

现在有表一(goods):

nosn
1aaa
2bbb
3ccc
4ddd

我们发现其中sn字段有写值存在错误,需要批量更新,比如我们需要把表一中的bbb,ccc变成xxx,zzz。

所以在临时表test中插入对应的变换关系:

临时表(test):

beforeafter
bbbxxx
ccczzz

解决办法

由于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更好理解一点。