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: 无法修改与非键值保存表对应的列
被修改的表则无需增加主键

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/3898/viewspace-871738/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/3898/viewspace-871738/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值