Oracle中的層次查詢詳解

2022-05-06 10:42:14 字數 4280 閱讀 6420

select

[level

], column, expr... from

table

[where condition

]start

with

condition

connect by[

prior column1= column2 |

column1 = prior column2

];

層次查詢是通過start with和connect by子句標識的:

1.其中level關鍵字是可選的,表示等級,1表示root,2表示root的child,其他相同的規則。

2.from之後可以是table,view但是只能是乙個table。

3.where條件限制了查詢返回的行,但是不影響層次關係,屬於將節點截斷,但是這個被截斷的節點的下層child不受影響。

4.start with是表示開始節點,對於乙個真實的層次關係,必須要有這個子句,但是不是必須的。

5.connect by prior是指定父子關係,其中prior的位置不一定要在connect by之後,對於乙個真實的層次關係,這也是必須的。

對於from是檢視的,那麼這個view不能包含join。

1.層次查詢from 之後如果是table,只能是乙個table,不能有join。

2.from之後如果是view,則view不能是帶join的。

3.使用order by子句,order子句是在等級層次做完之後開始的,所以對於層次查詢來說沒有什麼意義,除非特別關注level,獲得某行在層次中的深度,但是這兩種都會破壞層次。見增強特性中的使用siblings排序。

4.在start with中表示式可以有子查詢,但是connect by中不能有子查詢。

1、sys_connect_by_path

oracle 9i提供了sys_connect_by_path(column,char),其中column是字元型或能自動轉換成字元型的列名。它的主要目的就是將父節點到當前節點的」path」按照指定的模式展現出現。這個函式只能使用在層次查詢中。

下面的是oracle10g新增特性

2、 connect_by_isleaf

在oracle9i的時候,查詢指定root下的葉子節點,是很複雜的,oracle10g引入了乙個新的函式,connect_by_isleaf,如果行的值為0表示不是葉子節點,1表示是葉子節點。

3、connect_by_iscycle和nocycle關鍵字

如果從root節點開始找其子孫,找到一行,結果發生和祖先互為子孫的情況,則發生迴圈,oracle會報ora-01436: connect by loop in user data,在9i中只能將發生死迴圈的不加入到樹中或刪除,在10g中可以用nocycle關鍵字加在connect by之後,避免迴圈的參加查詢操作。並且通過connect_by_iscycle得到哪個節點發生迴圈。0表示未發生迴圈,1表示發生了迴圈。

4、connect_by_root

oracle10g新增connect_by_root,用在列名之前表示此行的根節點的相同列名的值。

5、使用siblings關鍵字排序

對於層次查詢如果用order by排序,比如order by last_name則是先做完層次獲得level,然後按last_name排序,這樣破壞了層次,比如特別關注某行的深度,按level排序,也是會破壞層次的。

在oracle10g中,增加了siblings關鍵字的排序。

語法:order  siblings  by

它會保護層次,並且在每個等級中按expre排序。

create

table tab_connect_by (child number,parent number

);

insert

into tab_connect_by (child, parent) values(2, 5

);

insert

into tab_connect_by (child, parent) values(3, 5

);

insert

into tab_connect_by (child, parent) values(10, 15

);

insert

into tab_connect_by (child, parent) values(5, 15

);

insert

into tab_connect_by (child, parent) values(9, 17

);

insert

into tab_connect_by (child, parent) values(8, 17

);

insert

into tab_connect_by (child, parent) values(15, 38

);

insert

into tab_connect_by (child, parent) values(17, 38

);

insert

into tab_connect_by (child, parent) values(6, 38

);

insert

into tab_connect_by (child, parent) values(13, 26

);

insert

into tab_connect_by (child, parent) values(1, 26

);

insert

into tab_connect_by (child, parent) values(12, 26

);

insert

into tab_connect_by (child, parent) values(11, 18

);

insert

into tab_connect_by (child, parent) values(7, 18

);

insert

into tab_connect_by (child, parent) values(38, null

);

insert

into tab_connect_by (child, parent) values(26, null

);

insert

into tab_connect_by (child, parent) values(18, null

);

commit;

select

a.child,

a.parent,

level

"層次",

sys_connect_by_path(child,

'<-

') "合併層次",

prior a.child "父節點",

connect_by_root a.child "根節點",

decode(connect_by_isleaf,

1, a.child, null

) "子節點",

decode(connect_by_isleaf,

1, '

是', '否'

) "是否子節點"

from

tab_connect_by a

start

with a.parent is

null

--從parent為空開始掃瞄

connect by prior a.child = a.parent --

以child為父列連線parent

order siblings by child desc

--對層次排序

;

select

level

, connect_by_iscycle,connect_by_isleaf,parent, child

from

tab_connect_by

connect

by nocycle prior child =

parent

start

with parent is

null;

oracle的層次查詢

語法 select 列名次from 表名次 where 條件 start with 條件connect by prior 當前表這段 級聯表字段。解釋 where 條件為可選,start with 條件connect by prior 語句完成遞迴查詢,形成一棵樹形結構。start with 表示開...

oracle 層次查詢

1 簡介 oracle層次化查詢是oracle特有的功能實現,主要用於返回乙個資料集,這個資料集存在樹的關係 資料集中存在乙個pid記錄著當前資料集某一條記錄的id 2 層次化查詢主要包含兩個子句,乙個start with另乙個是connect by。start with 這個子句一般用於指定層次化...

oracle層次查詢

層次查詢 hierarial retrival 1.層次查詢基本概念 層次查詢是描敘乙個樹狀結構,我們可以通過層次查詢來控制自上而下,或者自下而上的查詢樹狀資料。並且還可以確定查詢起始點 start with確定開始點 connect by確定遍歷的方向。2.層次查詢語法 select level ...