热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracleupdate+with的使用场景

droptabletestpurge;createtabletest(   idnumber,   codevarchar(20),   namevarchar(20)  
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行。

推荐阅读
author-avatar
手机用户2502859523
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有