connect by 例子(轉)

[size=large]原文地址:[url]http://blog.163.com/termie_gongzhen/blog/static/1200243362009516114844293/?fromdm&fromSearch&isFromSearchEngine=[/url]

connect by 例子 2009-06-16 11:48:44| 分類: IT技術 | 標籤: |舉報 |字號大

小 訂閱
層次查詢子句connect by,用於構造層次結果集的查詢。
語法:
[ START WITH condition ]
CONNECT BY [ NOCYCLE ] condition
說明:
a、START WITH:告訴系統以哪個節點作爲根結點開始查找並構造結果集,該節點即爲返回記錄中的最高節點。
b、當分層查詢中存在上下層互爲父子節點的情況時,會返回ORA-01436錯誤。此時,需要在connect by後面加上NOCYCLE關鍵字。同時,可用connect_by_iscycle僞列定位出存在互爲父子循環的具體節點。connect_by_iscycle必須要跟關鍵字NOCYCLE結合起來使用,用法見示例2。

用法舉例:

示例1:顯示所有地名關係結構。
SQL> select * from t;
AREA_ID AREA_NAME MGR_ID
-------- ---------- ------
86 中國
01 北京 86
02 福建 86
0101 海淀區 01
0102 朝陽區 01
0103 東城區 01
0104 西城區 01
0201 廈門 02
0202 福州 02
020101 湖裏 0201
020102 思明 0201
010401 復興門 0104
010402 西單 0104
已選擇13行。
SQL>
SQL> set pagesize 50
SQL> col AreaName for a12
SQL> col Root for a10
SQL> col Path for a24
SQL>
SQL> select rpad( ' ', 2*(level-1), ' ' ) || area_name "AreaName",
2 connect_by_root area_name "Root",
3 connect_by_isleaf "IsLeaf",
4 level ,
5 SYS_CONNECT_BY_PATH(area_name, '/') "Path"
6 from t
7 start with mgr_id is null
8 connect by prior area_id = mgr_id;
AreaName Root IsLeaf LEVEL Path
------------ ---------- ------ ---------- ------------------------
中國 中國 0 1 /中國
北京 中國 0 2 /中國/北京
海淀區 中國 1 3 /中國/北京/海淀區
朝陽區 中國 1 3 /中國/北京/朝陽區
東城區 中國 1 3 /中國/北京/東城區
西城區 中國 0 3 /中國/北京/西城區
復興門 中國 1 4 /中國/北京/西城區/復興門
西單 中國 1 4 /中國/北京/西城區/西單
福建 中國 0 2 /中國/福建
廈門 中國 0 3 /中國/福建/廈門
湖裏 中國 1 4 /中國/福建/廈門/湖裏
思明 中國 1 4 /中國/福建/廈門/思明
福州 中國 1 3 /中國/福建/福州
[size=large]已選擇13行。
說明:
a、prior:是單一操作符,放在列名的前面,等號左右均可; 放在父 ID 就是 尋找 祖先節點 ,放到本身 ID就是尋找 子節點 ;
b、connect_by_root:是單一操作符,返回當前層的最頂層節點;
c、connect_by_isleaf:是僞列,判斷當前層是否爲葉子節點,1代表是,0代表否;
d、level:是僞列,顯示當前節點層所處的層數;
e、SYS_CONNECT_BY_PATH:是函數,顯示當前層的詳細路徑。

示例2:找出人事部門中存在跟其他部門互爲管理者的人員名單。
SQL> select * from t2;
EMP DEPT MGR
------------ ------ ----------
劉濤 總裁辦
李飛 總裁辦 劉濤
張強 總裁辦 劉濤
王鵬 人事 李飛
李華 人事 李飛
張強 人事 李飛
李飛 行政 張強
吳華 行政 張強
已選擇8行。
SQL>
SQL> col emp for a12
SQL> select rpad( ' ', 2*(level-1), ' ' ) || emp "emp"
2 from t2
3 start with dept ='人事'
4 connect by prior emp = mgr;
ERROR:
ORA-01436: 用戶數據中的 CONNECT BY 循環

未選定行

說明:張強和李飛互爲管理者,因此,要用nocycle,如下所示:
SQL> select rpad( ' ', 2*(level-1), ' ' ) || emp "emp"
2 from t2
3 start with dept ='人事'
4 connect by nocycle prior emp = mgr;
emp
------------
王鵬
李華
張強
李飛
王鵬
李華
吳華
已選擇7行。

SQL>
SQL> select rpad( ' ', 2*(level-1), ' ' ) || emp "emp",
2 connect_by_iscycle "IsCycle"
3 from t2
4 start with dept ='人事'
5 connect by prior emp = mgr;
connect by prior emp = mgr
*
第 5 行出現錯誤:
ORA-30930: CONNECT_BY_ISCYCLE 僞列要求 NOCYCLE 關鍵字

說明:在用connect_by_iscycle定位節點時,也要用nocycle關鍵字,如下所示:

SQL>
SQL> select rpad( ' ', 2*(level-1), ' ' ) || emp "emp",
2 connect_by_iscycle "IsCycle"
3 from t2
4 start with dept ='人事'
5 connect by nocycle prior emp = mgr;emp IsCycle
------------ -------
王鵬 0
李華 0
張強 0
李飛 1
王鵬 0
李華 0
吳華 0
已選擇7行。
SQL>

示例3:僅顯示第二層(即level=2)省市名稱。
SQL> select rpad( ' ', 2*(level-1), ' ' ) || area_name "AreaName"
2 from t
3 where level = 2
4 start with mgr_id is null
5 connect by prior area_id = mgr_id;
AreaName
------------
北京
福建

示例4:用connect by構造序列。
SQL>
SQL> select rownum rn
2 from dual
3 connect by rownum<=10;
RN
----------
1
2
3
4
5
6
7
8
9
10
已選擇10行。
SQL> select rownum*2 -1 rn
2 from dual
3 connect by rownum<=10;
RN
----------
1
3
5
7
9
11
13
15
17
19
已選擇10行。

-----------------------------------------
附:建表語句
create table t (area_id varchar2(6), area_name varchar2(10), mgr_id varchar2(6));
insert into t values('86', '中國', null);
insert into t values('01', '北京', '86');
insert into t values('02', '福建', '86');
insert into t values('0101', '海淀區', '01');
insert into t values('0102', '朝陽區', '01');
insert into t values('0103', '東城區', '01');
insert into t values('0104', '西城區', '01');
insert into t values('0201', '廈門', '02');
insert into t values('0202', '福州', '02');
insert into t values('020101', '湖裏', '0201');
insert into t values('020102', '思明', '0201');
insert into t values('010401', '復興門', '0104');
insert into t values('010402', '西單', '0104');
commit;

create table t2 (emp varchar2(10), dept varchar2(6), mgr varchar2(10));
insert into t2 values('劉濤', '總裁辦', null);
insert into t2 values('李飛', '總裁辦', '劉濤');
insert into t2 values('張強', '總裁辦', '劉濤');
insert into t2 values('王鵬', '人事', '李飛');
insert into t2 values('李華', '人事', '李飛');
insert into t2 values('張強', '人事', '李飛');
insert into t2 values('李飛', '行政', '張強');
insert into t2 values('吳華', '行政', '張強');
commit;[/size][/[/size]size][/size]
發佈了25 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章