資料說明一切:
create
table dept(deptno number,deptname varchar2(20)
,mgrno number)
;insert
into dept values(1
,'總公司'
,null);
insert
into dept values(2
,'浙江分公司',1
);insert
into dept values(3
,'杭州分公司',2
);commit
;select t.
*from dept t;
deptno deptname mgrno
11 總公司
22 浙江分公司 1
33 杭州分公司 2
select
*from dept connect
by prior mgrno=deptno ;
--以子結點為開始向根結點遍歷
deptno deptname mgrno
11 總公司
22 浙江分公司 1
31 總公司
43 杭州分公司 2
52 浙江分公司 1
61 總公司
select
*from dept start
with mgrno=
1connect
by prior mgrno=deptno ---以子結點為開始且開始為1,的遍歷
deptno deptname mgrno
12 浙江分公司 1
21 總公司
select
from dept connect
by prior deptno= mgrno
deptno deptname mgrno
12 浙江分公司 1
23 杭州分公司 2
33 杭州分公司 2
41 總公司
52 浙江分公司 1
63 杭州分公司 2
select
*from dept start
with mgrno=
1connect
by prior deptno= mgrno
deptno deptname mgrno
12 浙江分公司 1
23 杭州分公司 2
1)prior
放在子節點端,則表示掃瞄樹是以start with
指定的節點作為根節點從上往下掃瞄。可能對應乙個或多個分支。
start with
可以省略,如果省略,表示對所有節點都當成根節點分別進行遍歷
2)prior
放在父節點端,則表示掃瞄樹是以start with
指定的節點作為最低層子節點,從下往上掃瞄。順序是子節點往父節點掃瞄,直到根節點為止,這種情況只能得到乙個分支。
start with
可以省略,如果省略,表示對所有節點都當成最低層子節點分別往根節點方向遍歷
最後會了上面大家應該知道下面sys_connect_path()
sys_connect_by_path
函式主要作用是可以把乙個父節點下的所有子節點通過某個字元進行區分,然後連線在乙個列中顯示:
select
/* max(substr(*/sys_connect_by_path(deptname,
',')
/*,2))*/
from dept connect
by prior deptno= mgrno;
sys_connect_by_path(deptname,'
1,浙江分公司
2,浙江分公司,杭州分公司
3,杭州分公司
4,總公司
5,總公司,浙江分公司
6,總公司,浙江分公司,杭州分公司
通過子節點向根節點追朔.
select
*from persons.dept start
with deptid=
76connect
by prior paredeptid=deptid
通過根節點遍歷子節點(不包含根節點).
select
*from persons.dept start
with paredeptid=
0connect
by prior deptid=paredeptid
通過根節點遍歷子節點(包含根節點).
select
*from persons.dept start
with deptid=
0connect
by prior deptid=paredeptid
可通過level
關鍵字查詢所在層次.
select a.*,
level
from persons.dept a start
with paredeptid=
0connect
by prior deptid=paredeptid
start with ...connect by
的用法,start with
後面所跟的就是就是遞迴的種子。
遞迴的種子也就是遞迴開始的地方connect by
後面的"prior
" 如果預設:則只能查詢到符合條件的起始行,並不進行遞迴查詢;
connect by prior
後面所放的字段是有關係的,它指明了查詢的方向。
練習: 通過子節點獲得頂節點
select first_value(deptid)
over
(order
bylevel
desc
rows
unbounded
preceding
)as firstdeptid from persons.dept start
with deptid=
76connect
by prior paredeptid=deptid
表結構
deptid paredeptid name
number number char
(40 byte)
部門id 父部門id(所屬部門id) 部門名稱
oracle樹中prior的用法
oracle中 從子節點查詢,直到根節點的乙個分支 或者從根節點查詢,知道字節點的許多分支 可以用proir 總結 1 prior放在子節點端,則表示掃瞄樹是以start with指定的節點作為根節點從上往下掃瞄。可能對應乙個或多個分支。start with可以省略,如果省略,表示對所有節點都當成根...
ORACLE中的( )怎麼用
分享 2011 02 15 10 03 為女兒而奮鬥 瀏覽 19788 次 oracle 2011 02 15 10 12 提問者採納 就是連線 譬如select a.b.from a b就是乙個右連線,等同於select a.b.from a right join b select a.b.fro...
oracle中的sql用遞迴查詢樹格式資料
1.查詢當前節點的子類 with cte child grid id,grid name,parent grid code as 起始條件 select grid id,grid name,parent grid code from t sg grid where grid id 2 列出父節點查詢...