oracle级联更新和update效率,update关联更新在sqlserver和oracle中的实现

sqlserver和oracle中实现update关联更新的语法不同,都可以通过inline view(内嵌视图)

来实现,总的来说sqlserver更简单些. 测试例子如下:

[@more@]

create table tmp_a

(cpcode varchar2(10),

sb_ym varchar2(6),

flag char(1)

);

create table tmp_b

(cpcode varchar2(10),

sb_ym varchar2(6),

flag char(1)

);

insert into tmp_a(cpcode,sb_ym,flag)values('3201910001','200406','e');

insert into tmp_a(cpcode,sb_ym,flag)values('3201910002','200406','e');

insert into tmp_b(cpcode,sb_ym,flag)values('3201910001','200406','r');

insert into tmp_b(cpcode,sb_ym,flag)values('3201910002','200406','r');

insert into tmp_b(cpcode,sb_ym,flag)values('3201910003','200406','r');

insert into tmp_b(cpcode,sb_ym,flag)values('3201910004','200406','e');

commit;

在SQLSERVER中:

update tmp_b set flag = b.flang from tmp_a a,tmp_b b

where a.cpcode =b.cpcode and a.sb_ym = b.sb_ym;

在Oracle中:

方法一:(效率低)

update tmp_b a

set flag = (select flag from tmp_a b

where a.cpcode = b.cpcode and a.sb_ym = b.sb_ym )

where exists

(select * from tmp_a c

where a.cpcode = c.cpcode and a.sb_ym = c.sb_ym);

Statistics

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

8 recursive calls

3 db block gets

18 consistent gets

0 physical reads

0 redo size

方法二:(效率高)

alter table tmp_a add constraint p_tmp_a primary key (cpcode, sb_ym);

update (select b.flag flagb,a.flag flaga

from tmp_a a,tmp_b b

where a.cpcode=b.cpcode

and a.sb_ym=b.sb_ym)

set flagb=flaga;

Statistics

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

0 recursive calls

3 db block gets

7 consistent gets

0 physical reads

0 redo size

注意:方法二中数据源表必须要加上主键,否则会报错

ORA-01779: 无法修改与非键值保存表对应的列

被修改的表则无需增加主键

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值