1.1 概要 21.2 節點術語 2
1.3 使用connect by 和 start with子句3
1.4 層次查詢例項 3
1.5 從下向上查詢 4
1.6 從層次查詢中刪除節點和分支5
備註:無法顯示,請到文庫檢視
1.1 概要
我們經常可以見到組織為層次的資料,比如乙個公司的工作的人員就構成了乙個層次,這個層次可以使用樹的形式來表示。例如
oracle
的表scott.emp
,就可以使用如下的樹來表示:
下面是查詢
scott.emp
表返回的行:
其中mgr
列是乙個自引用列,它指回
empno
列。mgr
表示乙個員工的管理者或者上級。在
oracle
中可以使用
connect by
和start with
子句來查詢這種層次結構的資料。
1.2
節點術語
如上圖所示,這些元素構成了一棵樹。有關節點構成樹有一些技術術語,如下:
1)根節點:根節點是位於樹頂端的節點。如上圖所示,根節點是「
king」。
2)父節點:父節點的下面有乙個或
多個節點。
3)子節點:子節點上面有乙個父節點。
4)葉節點:葉節點是沒有子節點的節點。
1.3
使用connect by
和start with子句
select
語句的connect by
和start with
子句的語法如下:
select [level],column...
from table
[where where_condition]
[[start with start_condition] [connect by prior prior_condition]]
其中: l
level:是乙個」偽列
」,代表樹的第幾層。對於根節點來說,
level為1
,根節點的子節點層次為2…
lstart_condition:定義了層次化查詢的起點。層次化查詢必須指定
start with
子句。例如,可以指定
start_condition
定義為empno=7839 (king)
,代表從
king
開始查詢。 l
prior_condition:定義了父行與子行的關係。當編寫層次化查詢時必須定義
connect by prior
子句。例如,可以將
prior_condition
定義為enpno=mgr
,表示父節點的
enpno
和子節點的
mgr
之間存在關係,也就是說,子節點的
mgr
指向父節點的
enpno
。其中跟在
prior
關鍵字後面的代表父節點。
1.4
層次查詢例項
1)查詢
emp表的層次關係。查詢「
jones
「下面的員工
select e.empno,
e.mgr,
e.ename
from scott.emp e
start with e.ename = 'jones'
connect by prior e.empno = e.mgr
查詢結果:
empno mgr ename
----- ----- ----------
7566 7839 jones
7788 7566 scott
7876 7788 adams
7902 7566 ford
7369 7902 smith
預期結果:
2)使用偽列
level
select level,
e.empno,
e.mgr,
e.ename
from scott.emp e
start with e.ename = 'jones'
connect by prior e.empno = e.mgr
查詢結果:
level empno mgr ename
---------- ----- ----- ----------
1 7566 7839 jones
2 7788 7566 scott
3 7876 7788 adams
2 7902 7566 ford
3 7369 7902 smith
1.5
從下向上查詢
不一定非要按照從父節點到子節點的順序從上至下遍歷樹;也可以從某個子節點開始,從下而上遍歷。實現的方法是交換父節點和子節點在
connect by prior
子句中的順序。例如,
connect by prior mgr = empno
可以將子節點的
mgr
連線到父節點的
empno 上。
--從葉節點
」smith」,
從下向上查詢到根節點:
select level,
e.empno,
e.mgr,
e.ename
from scott.emp e
start with e.ename = 'smith'
connect by prior e.mgr = e.empno;
查詢結果:
level empno mgr ename
---------- ----- ----- ----------
1 7369 7902 smith
2 7902 7566 ford
3 7566 7839 jones
4 7839 king
1.6
從層次查詢中刪除節點和分支
1.
刪除節點
可以用where
子句從查詢樹中除去某個特定的節點,下面這個查詢使用
where e.ename != 'ford'
子句從結果中除去
ford
select level,
e.empno,
e.mgr,
e.ename
from scott.emp e
where e.ename != 'scott'
start with e.ename = 'jones'
connect by prior e.empno = e.mgr;
查詢結果:
level empno mgr ename
---------- ----- ----- ----------
1 7566 7839 jones
3 7876 7788 adams
2 7902 7566 ford
3 7369 7902 smith
可以看到,儘管
scott
已經從結果中除去了,但是他的下屬
adams
仍然在結果中。為了將整個分支都從查詢結果中除去,可以再
connect by prior
子句中使用
and
子句。例如下面這個例子使用
and e.ename != 'scott'
將scott
及其所有下屬從結果中除去
2.
刪除分支
select level,
e.empno,
e.mgr,
e.ename
from scott.emp e
start with e.ename = 'jones'
connect by prior e.empno = e.mgr
and e.ename != 'scott';
查詢結果:
level empno mgr ename
---------- ----- ----- ----------
1 7566 7839 jones
2 7902 7566 ford
3 7369 7902 smith
oracle 層次化查詢
1 層次化查詢 層次化 同一資料庫表中多條資料存在父子關係,形成樹狀結構。利用connect by 進行層次化查詢 按照某種規則,獲得節點路徑上的節點集合。如 select from market b start with b m id 10 b connect by prior b p id m ...
Oracle 層次化查詢
create table employees employee id integer constraint employees pk primary key,manager id integer constraint employees fk employees references employe...
Oracle層次化查詢(新)
今天要通過乙個組織機構樹通過得到機構編號向上得到所有的父級機構的使用者列表。怎麼辦,肯定是用層次化查詢了。記得原來的文章裡邊有帖子。黏貼過來。結果發現會報錯 ora 01436 這個是因為父節點和子節點有鏈結上的錯誤,可能會出現迴圈。就是父節點的父節點又鏈結到子節點一樣,有死迴圈 後來沒辦法。最後再...