oracle用 with update,Oracle update+with的使用场景

drop table test purge;

create table test(

id number,

code varchar(20),

name varchar(20)

);

insert into test values(1,'201401','aaa');

insert into test values(2,'201402','bbb');

insert into test values(3,'201402','ccc');

insert into test values(4,'201403','ddd');

insert into test values(5,'201403','eee');

insert into test values(6,'201403','fff');

commit;

--现在有这个一个需求,如果code有重复,根据code进行分组加上1,2,3,

--如code=201402的记录,code为:201402_1、201402_2

--1.可以用分析函数拼出code

SQL> select t.id,code||'_'||row_number() over(partition by code order by id) cc from test t;

ID CC

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

1 201401_1

2 201402_1

3 201402_2

4 201403_1

5 201403_2

6 201403_3

已选择6行。

--2.用传统写法看行不行,发现不行

SQL> update test t set t.code=(select code||'_'||row_number()

over(partition by code order by id) code

from test t1 where t1.id=t.id);

已更新6行。

SQL> select * from test;

ID CODE                 NAME

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

1 201401_1             aaa

2 201402_1             bbb

3 201402_1             ccc

4 201403_1             ddd

5 201403_1             eee

6 201403_1             fff

已选择6行。

SQL> rollback;

--看来需要建一个临时表,然后用update和merge,不过还有一种写法

--3.update和with组合 SQL> update test b set b.code=(     with t as     (select t.id,code||'_'||row_number() over(partition by code order by id) code         from test t)     select a.code from t a where a.ID=b.ID     ); 已更新6行。 SQL> select * from test;         ID CODE                 NAME ---------- -------------------- --------------------          1 201401_1             aaa          2 201402_1             bbb          3 201402_2             ccc          4 201403_1             ddd          5 201403_2             eee          6 201403_3             fff 已选择6行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值