oracle遷移父子數據

?

現有需求如下,業務組織單元表中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子句里的表的每一數據行。


2、層級查詢語句(hierarchical query)中,CONNECT BY子句是必選的,而START WITH子句是可選的,START WITH子句是用來修飾CONNECT BY子句的,若該子句被省略,則表示所有滿足查詢條件(即where子句里的條件)的行作為根節點

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 子句的限定條件來篩選出哪些數據行作為根節點而已
start with子句不是一個獨立的子句,即start with子句是一個不能單獨出現在SQL語句的子句,必須在SQL語句中出現了connect by子句后,才能出現

當connect by子句的條件里出現的字段是普通字段,不是偽列字段rownum或是level時,connect by子句的條件里的表達式必須要有prior運算符 放在一個字段的前面;當connect by子句的條件里出現的是偽列字段rownum或是level時,connect by子句的條件里的表達式不用出現prior運算符
?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535519.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535519.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535519.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

批量更新數據庫數據

"update isc22.isc_user t set t.saphrid "&E1&"where t.id "&B1&";"

oracle控制文件

控制文件是數據庫里面非常重要的一類文件,它記錄了當前實例連接的數據庫的結構和行為&#xff0c;并維護數據庫的一致性。 初始化參數文件中描述其位置&#xff0c;很小的:二進制文件,一般不要超過100mmount讀open一直在用 控制文件只能連接一個database丟失要恢復 …

oracle表空間

概念 表空間和數據文件 ●表空間是邏輯存儲概念&#xff0c;一個表空間是一個或多個數據文件的邏輯集合 ●存儲對象(表、索引)邏輯的存儲在表空間上&#xff0c;而存儲對象的數據物理的存放在數據文件上 ●數據庫至少需要一個叫做system的表空間&#xff0c;也就是系統表空間 ●…

oracle日志

日志分類 redo log files聯機日志或重做日志 archived log files歸檔日志 1184198alert log files 告警日志 trace files user_ _dump_ _dest 用戶信息日志如跟蹤會話日志 background dump_ dest進程日志還有其他一-些不常用的日志 v$database的log_mode 數據庫歸檔模式…

MySQL:分庫分表知識點盤點

本篇內容包括&#xff1a;數據庫瓶頸、分庫分表以及分庫分表相關問題 一、數據庫瓶頸 不管是IO瓶頸&#xff0c;還是CPU瓶頸&#xff0c;最終都會導致數據庫的活躍連接數增加&#xff0c;進而逼近甚至達到數據庫可承載活躍連接數的閾值。在業務Service來看就是&#xff0c;可用…

oracle的sga

sga SGA的管理 ■有三種方式&#xff1a; ●8i:SGA的總大小由所有內存組件大小之和決定&#xff0c;不能直接定義SCA大小。對內部組件大小的修改必須在數據庫重起 后 才能生為&#xff0c;所以叫做SGA的靜態管理。 ●9i&#xff…

MySQL:日志知識點盤點

本篇內容包括&#xff1a;binlog&#xff08;二進制日志&#xff09;、redo log 以及 undo log 一、binlog&#xff08;二進制日志&#xff09; binlog 用于記錄數據庫執行的寫入性操作(不包括查詢)信息&#xff0c;以二進制的形式保存在磁盤中。binlog是mysql的邏輯日志&…

ROWNUM的使用

一個偽列看起來像是一個表中的列&#xff0c;但實際上并不保存在表中。你可以查詢&#xff0c; 但是不能插入&#xff0c;修改和刪除其中的值。一個偽列也類似于一個沒有參數的函 數。但是在典型情況下&#xff0c;在結果集中可以為每一行返回相同的值&#xff0c;而偽列通 常為…

MySQL:主從相關知識點盤點

本篇內容包括&#xff1a;MySQL 主從復制簡介、主從復制的原理以及主從搭建 一、MySQL 主從復制簡介 在實際的生產中&#xff0c;為了解決Mysql的單點故障已經提高MySQL的整體服務性能&#xff0c;一般都會采用**「主從復制」**。 比如&#xff1a;在復雜的業務系統中&#x…

oracle導出expdp

expdp/impdp 是 oracle 10g 版本后推出的服務器端工具--數據泵&#xff0c;作用是為了將數據庫中的邏輯對象&#xff0c;比如表、用戶、全庫、表空間進 行導入&#xff0c;導出 命令解析 ATTACH ATTACH [[schema_name.]job_name] schema_name 表示用戶名,job_name 表示導出的作…

oracle導入impdp

expdp/impdp 是 oracle 10g 版本后推出的服務器端工具--數據泵&#xff0c;作用是為了將數據庫中的邏輯對象&#xff0c;比如表、用戶、全庫、表空間進 行導入&#xff0c;導出REMAP_DATAFILE 該選項用于將源數據文件名轉變為目標數據文件名, 在不同平臺之間搬移表空間時可能需…

oracle高水位線

ORACLE在邏輯存儲上分4個粒度: 表空間, 段, 區 和 塊. 1.1 塊: 是粒度最小的存儲單位,現在標準的塊大小是8K,ORACLE每一次I/O操作也是按塊來操作的,也就是說當ORACLE從數據文件讀數據時,是讀取多少個塊,而不是多少行. 每一個Block里可以包含多個row. 1.2 區:…

oracle檢查點

檢 查 點 概述 ■l當修改數據時&#xff0c;需要首先將數據讀入內存中&#xff08;Buffer Cache&#xff09;&#xff0c;修改數據的同時&#xff0c;Oracle會記錄重做信息&#xff08;Redo&#xff09;用于恢復。因 為有了重做信息的存在&#xff0c;Oracle不需要在提交時…

文獻翻譯:Java theory and practice: Fixing the Java Memory Model, Part 2

Java theory and practice: Fixing the Java Memory Model, Part 2 譯&#xff1a;Java 理論與實踐&#xff1a;修復 Java 內存模型&#xff0c;第 2 部分 翻譯自&#xff1a;http://www.ibm.com/developerworks/library/j-jtp03304/&#xff08;原文寫于2004年3月&#xff0…

oracle的buffercache

LRU空閑或者干凈的鏈&#xff0c;可以從這里找到未修改的數據LRUW臟鏈&#xff0c;一個臟塊同時掛到了lruw和檢查點隊列&#xff0c;LRUW分冷端和熱端&#xff0c;冷端即為更新頻率較低的一端&#xff0c;熱端為更新頻率較高的一端&#xff0c;dbwn寫入數據文件時從冷端開始寫入…

oracle的undo

Undo段中區的狀態free expiredinactiveactive 顯示UNDO區信息 SELECT extent_ id, bytes&#xff0c; status FROM dba_ _undo_ _extentsWHERE segment_ name SYSSMU1S ; 圖解一一個事務的操作流程 Undo段的組成:段頭、回滾塊 事務ID …

SQLPlus命令詳細說明

SQLPlus命令詳細說明 2011-10-19 17:23:01 分類&#xff1a; Oracle 1. 執行一個SQL腳本文件 SQL>start file_name SQL> file_name 2. 對當前的輸入進行編輯 SQL>edit 3. 重新運行上一次運行的sql語句 SQL>/ 4. 將顯示的內容輸出到指定文件 SQL> S…

oracle的EMCTL

Microsoft Windows [版本 6.1.7601] 版權所有 (c) 2009 Microsoft Corporation。保留所有權利。 C:\Users\Administrator>emctl start dbconsole Environment variable ORACLE_UNQNAME not defined. Please set ORACLE_UNQNAME to da tabase unique name. C:\Users\Administ…

RHEL7 修改SSH默認端口

1.查詢seliunx [roottest10597 ~]# getenforce Enforcing [roottest10597 ~]# semanage port -l|grep ssh ssh_port_t tcp 222.設置selinux端口 [roottest10597 ~]# semanage port -a -t ssh_port_t -p tcp 10022 [roottest10597 ~]# semanage …

oracle預定義異常

NO_DATA_FOUND&#xff1a;執行查詢無數據、引用一個末初使化的表、通過UTL_FILE包調用到尾的文件TOO_MANY_ROWS&#xff1a;采用SELECT INTO語句&#xff0c;但返回的記錄超過了1條DUP_VAL_ON_INDEX:插入或者更新語句&#xff0c;與唯一索引相沖突TIMEOUT_ON_RESOURCE:等待資源…