?
現有需求如下,業務組織單元表中id字段數據在另外一個系統全部重復,但需要將此業務單元組織導入另一系統
業務組織單元表Isc_Specialorg_Unit
表中存在ID字段為子節點數據,parent_id為父節點數據,orgpath為組織路徑
現在做如下操作:
1.創建臨時表
create table test as select * from Isc_Specialorg_Unit t
2.在test表中增加三列id1,parent_id1,orgpath1
alter table test add (id1 varchar(32));
alter table test add (parent_id1 varchar(32));
alter table test add (or1 varchar(32));
3.更新id1列為隨機數據
update test set id1=SYS_GUID()
4.根據表test在創建臨時表test1
create table test1 as select * from test tselect 'create table test1 as select '|| wm_concat(column_name) || ' from test' sqlStr from user_tab_columns where table_name='test';
5.根據id列,parent_id列,id1,更新parent_id1列的值為id1的值
merge into test k
using (select a.id1,a.id from test1 a) kk
on (k.parent_id=kk.id)
when matched then update set k.parent_id1=kk.id1
6.將test中id列和parent_id列刪掉
alter table test drop column id;
alter table test drop column parent_id;
7.修改id1為id,pranent_id1為parent_id,獲取組織路徑并創建表test3
create table test3 as
select distinct a.id ,sys_connect_by_path(id,'/') orgpath from test a start with a.id='1'connect by prior a.id=a.parent_id
7.根據test3表將組織路徑保存至test的orgpath中
merge into test b
using
(
select a.id,a.orgpath from test3 a
) kk
on (b.id=kk.id)
when matched then update set b.orgpath=kk.orgpath
8.導出表test為sql文件,刪掉表 drop test;drop test1;drop test3導入另一系統數據庫
?
備注: select ... from <TableName> where <Conditional-1> start with <Conditional-2> connect by <Conditional-3> ? ? connect by中的條件就表示了父子之間的連接關系,比如?connect by id=prior ?pid LEVEL偽列表示樹的深度(或叫高度) 其中 connect by 與 start with 語句擺放的先后順序不影響查詢的結果,[where 條件1]可以不需要,若是出現則要放在?connect by 與 start with 語句之前,否則出錯 ?[where 條件1]、[條件2]、[條件3]各自作用的范圍都不相同:????? ?[where 條件1] 是在根據“connect by [條件2] start with [條件3]”選擇出來的記錄中進行過濾,是針對單條記錄的過濾, 不會考慮樹的結構(最后的過濾); ?[?connect by?條件2] 指定構造樹的條件,以及對樹分支的過濾條件,在這里執行的過濾會把符合條件的記錄及其下的所有子節點都過濾掉; ?? ?[?start with?條件3] 限定作為搜索起始點的條件,如果是自上而下的搜索則是限定作為根節點的條件,如果是自下而上的搜索則是限定作為葉子節點的條件;? 要根據connect by 從上到下還是從下到上,來確定起始節點,可能是葉節點,也可能是父節點,這些開始節點可以是多個,并且包含這些節點。 層級查詢語句(hierarchical query)中,where子句先被執行,再執行CONNECT BY子句以及其附屬子句1、這里說的節點指的是層級查詢語句(hierarchical query)中from子句里的表的每一數據行。
3、prior關鍵字放在CONNECT BY子句中。其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR id = parent_id就是說上一條記錄的id 是本條記錄的parent_id,即本記錄的父親是上一條記錄,prior放在connect by子句連接條件里的哪一邊,哪一邊就是父節點的編號值的來源,而connect by子句連接條件里等號另一邊就是記錄一數據行其對應的父節點的編號值 ? START WITH 子句和CONNECT BY子句是兩個相互獨立的子句,即并沒有規定START WITH 子句出現的列就是要為CONNECT BY子句里那個帶有關鍵字prior的列,START WITH 子句出現的列可以來自表里的任何列,也就是說START WITH 子句出現的列可以沒有在START WITH 子句里出現,因為START WITH 子句的作用就是根據START WITH 子句的限定條件來篩選出哪些數據行作為根節點而已 當connect by子句的條件里出現的字段是普通字段,不是偽列字段rownum或是level時,connect by子句的條件里的表達式必須要有prior運算符 放在一個字段的前面;當connect by子句的條件里出現的是偽列字段rownum或是level時,connect by子句的條件里的表達式不用出現prior運算符 ? |
?
?