Oracle層次化查詢學習總結

2021-07-03 07:02:48 字數 4572 閱讀 6024

1.1 概要 2

1.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 這個是因為父節點和子節點有鏈結上的錯誤,可能會出現迴圈。就是父節點的父節點又鏈結到子節點一樣,有死迴圈 後來沒辦法。最後再...