oracled update_Oracle数据库之oracle update set select from 关联更新

本文主要向大家介绍了Oracle数据库之oracle update set select from 关联更新,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助。

工作中有个需求,现在新表中有一些数据跟老表的基本一样,这样只需要把老表中数据搬到新表中就可以了,同时把不同的字段修改下数据即可,在修改字段时发现,需要指定一个条件,比如主键id,来修改某条记录,这样一条一条修改效率太低了,有没有批量操作的方式呢?SQL>select * from wwn2;

TOWN                         ID

-------------------- ----------

222                         222

111                         111

ww‘jj                       111

llll                       1111

dddd                       2222

lllldf                      111

lllldf                      111

dsafdf                      111

3435                        111

ljjjjj                      222

dsafdf                      111

3435                        111

ljjjjj                      222

SQL> select * from wwm5;

TOWN                         ID

-------------------- ----------

lllldf                      111

test                       9984

SQL> select wwm2.* from wwm2,wwm5 where wwm2.id=wwm5.id

TOWN                         ID

-------------------- ----------

111                         111

ww‘jj                       111

lllldf                      111

lllldf                      111

dsafdf                      111

3435                        111

dsafdf                      111

3435                        111

8 rows selected.

--需要更新8条数据是正确的

下面是一个错误的做法:

SQL>  update wwm2 set wwm2.town=(select wwm5.town from wwm5 where wwm5.id=wwm2.id)

13 rows updated.

SQL> select * from wwm2;

TOWN                         ID

-------------------- ----------

222

lllldf                      111

lllldf                      111

1111

2222

lllldf                      111

lllldf                      111

lllldf                      111

lllldf                      111

222

lllldf                      111

lllldf                      111

222

13 rows selected.

--可以看到13条记录被更新,符合条件的更新正确,不符合条件的也更新为NULL.以下是正确的方法

解决方法:

方法一:

SQL> update wwm2

2  set town=(select town from wwm5 where wwm5.id=wwm2.id)

3  where id=(select wwm5.id from wwm5 where wwm5.id=wwm2.id)

方法二:

SQL> update wwm2

set town=(select town from wwm5 where wwm5.id=wwm2.id)

where exists (select 1 from wwm5 where wwm5.id=wwm2.id)

方法三:

1  declare

2  cursor cur_wwm is select town,id from wwm5;

3  begin

4     for my_wwm in cur_wwm loop

5     update wwm2 set town=my_wwm.town

6     where id=my_wwm.id;

7     end loop;

8 end;

说明:如果select 子句可以返回多行记录,但返回适合where条件的记录只能是唯一的,否则将会报返回单行的select子句返回多行的错误,因为update只能跟据此处的where子句(内层where)进行相应记录的匹配更新,一次只能是一条。实际使用的sql为:

update table1 s set s.yesterday = (select yesterday from table1_BACK sb where sb.tagname = s.tagname and rownum = 1) where s.tagname = (select tagname from table1_BACK sb where sb.tagname = s.tagname);update table1 s set s.yesterday = (select yesterday from table1_BACK sb where sb.tagname = s.tagname and rownum = 1) where exists (select 1 from table1_BACK sb where sb.tagname = s.tagname);

写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,文章可以转载,无需版权。希望尽自己的努力,做到更好,大家一起努力进步!

如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!

本文由职坐标整理并发布,希望对同学们学习Oracle有所帮助,更多内容请关注职坐标数据库Oracle数据库频道!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值