程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracleupdate+with的使用場景

Oracleupdate+with的使用場景

編輯:Oracle教程

Oracleupdate+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行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved