oracle connect by level 應用

關鍵字:oracle connect by level 樹狀結構表
定義如下id 和 名稱描述
1— [color=green]省長[/color] <--- 2,3 (省長管轄市長、縣長)
2— [color=green]市長[/color] <--- 5,6 (市長管轄模範村村長和一個平民)
3— [color=green]縣長[/color] <--- 4,7,8,9 (縣長管轄鎮長和三個平民)
4— 鎮長 <--- 10,11,12,13 (管轄四個平民)
5— 村長 <--- 14,15 (管轄兩個平民)
其他(6-15)— 平民(沒有管轄任何人)

只有[color=green]省長、市長[/color]和[color=green]縣長[/color]能處理問題,那麼每個人出了問題應該[color=red]首先[/color]找誰來解決?
省長權利最大,自己出了問題自己解決,別人也沒法知道; 可以認爲在關係表裏省長的父節點是自己。
[img]http://freejvm.iteye.com/picture/125052[/img]

create table person(id int primary key, description varchar2(50));
create table relationship(child int, parent int, primary key(child,parent));
insert into person values(1,‘省長’);
insert into person values(2,‘市長’);
insert into person values(3,‘縣長’);
insert into person values(4,‘鎮長’);
insert into person values(5,‘村長’);
insert into person values(6,‘平民’);
...//省略的都是平民
insert into person values(15,‘平民’);

insert into relationship values(1,1); //關係如下
insert into relationship values(2,1);
insert into relationship values(3,1);
insert into relationship values(5,2);
insert into relationship values(6,2);
insert into relationship values(4,3);
insert into relationship values(7,3);
insert into relationship values(8,3);
insert into relationship values(9,3);
insert into relationship values(10,4);
insert into relationship values(11,4);
insert into relationship values(12,4);
insert into relationship values(13,4);
insert into relationship values(14,5);
insert into relationship values(15,5);

查看一下關係樹:

select rpad('---',(level-1)*3,'---')||child relation_tree
from relationship
start with child=parent
connect by nocycle prior child=parent; --結果如下
RELATION_TREE
------------------
1
---2
------5
---------14
---------15
------6
---3
------4
---------10
---------11
---------12
---------13
------7
------8
------9

已選擇15行。

查看父子關係情況:

select child,parent
from relationship
start with child=parent
connect by nocycle prior child=parent
order by parent; --結果如下
CHILD PARENT
---------- ----------
1 1
2 1
3 1
5 2
6 2
4 3
8 3
7 3
9 3
11 4
12 4
10 4
13 4
14 5
15 5

已選擇15行。

下面要看一看:每個人有事時,首先找到誰來處理?不能每個人有事都找省長吧。
下面的sql使用了oracle家的兩個變態函數:first_value & connect_by_root

select distinct child ,first_value(parent)over(partition by child order by lv) parent
from(
select connect_by_root(r.child) child, p.description descr, level lv, r.parent
from person p ,relationship r
where p.id= r.parent
connect by nocycle prior r.parent=r.child
)
where descr in('省長', '市長', '縣長')
order by parent,child; --結果如下
CHILD PARENT
---------- ----------
1 1
2 1
3 1
5 2
6 2
14 2
15 2
4 3
7 3
8 3
9 3
10 3
11 3
12 3
13 3

已選擇15行。

這個sql到底行不行,再加條數據看看

insert into person values(333,‘縣長’);
insert into person values(555,‘村長’);
insert into person values(666,‘平民’);
insert into person values(777,‘平民’);

insert into relationship values(333,1);
insert into relationship values(555,333);
insert into relationship values(666, 555);
insert into relationship values(777,666);
--666這個平民有¥,777願意跟着他(這條記錄比較特殊)

再使用上面的語句查看一下,結果如期所至。
給個DDL & DML文件,方便一下需要的童鞋。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章