天天看點

Oracle的start with ... connect by prior ...

資料準備:

create table zxtable

( parentid varchar2(10),

subid varchar2(10)

);

insert into zxtable values ( '1','2');

insert into zxtable values ( '1','3');

insert into zxtable values ( '2','4');

insert into zxtable values ( '2','5');

insert into zxtable values ( '3','6');

insert into zxtable values ( '3','7');

insert into zxtable values ( '5','8');

insert into zxtable values ( '5','9');

insert into zxtable values ( '7','10');

insert into zxtable values ( '7','11');

insert into zxtable values ( '10','12');

insert into zxtable values ( '10','13');

commit;

select * from zxtable ;

Oracle的start with ... connect by prior ...
對應B樹的結構為:
Oracle的start with ... connect by prior ...

start with 子句:周遊起始條件。如果要查父結點,這裡用子結點的列,反之。

connect by 子句:連接配接條件。關鍵詞prior,prior跟父節點列parentid放在一起,就是往父結點方向周遊;prior跟子結點列subid放在一起,則往葉子結點方向周遊。parentid、subid兩列誰放在“=”前都無所謂,關鍵是prior跟誰在一起。

order by 子句:排序(desc降序、asc升序)。

Oracle的start with connect by prior主要是用于B樹結構類型的資料遞歸查詢,給出B樹結構類型中的任意一個結點,周遊其最終父結點或者子結點。分為四種使用情況:

第一種:start with 子節點ID='...' connect by prior 子節點ID = 父節點ID

select parentid,subid,level from zxtable
start with subid='7' 
connect by prior subid=parentid
order by level desc;           

按照條件subid='7',對'7'(包括自己)及其子節點進行遞歸查詢,結果如下:

Oracle的start with ... connect by prior ...

查詢結果自己所有的後代節點(包括自己)

第二種:start with 子節點ID='...' connect by 子節點ID = prior 父節點ID

select parentid,subid,level from zxtable
start with subid='7' 
connect by subid=prior parentid
order by level desc;           

按照條件subid='7',對'7'(包括自己)及其父節點進行遞歸查詢,結果如下:

Oracle的start with ... connect by prior ...

查詢結果自己所有的前代節點(包括自己)

第三種:start with 父節點ID='...' connect by prior 子節點ID = 父節點ID

select parentid,subid,level from zxtable
start with parentid='7' 
connect by prior subid=parentid
order by level desc;           

按照條件parentid='7',對'7'(不包括自己)子節點進行遞歸查詢,結果如下:

Oracle的start with ... connect by prior ...

查詢結果自己所有的後代節點(不包括自己)。

分析:

connect by 子句中,prior跟subid在同一邊,就是往葉子結點方向周遊去了。因為7有兩個子結點,是以第一級中有兩個結果(10和11)。10有兩個子結點(12和13),11無,是以第二級也有兩個結果(12,13)。即12,13就是葉子結點。

第四種:start with 父節點ID='...' connect by 子節點ID = prior 父節點ID

select parentid,subid,level from zxtable 
start with parentid='7' 
connect by subid = prior parentid
order by level desc;           

按照條件parentid='7',對'7'(包括自己)的第一代孩子們及其父節點進行遞歸查詢,結果如下:

Oracle的start with ... connect by prior ...

查詢結果自己的第一代後節點和所有的前代節點(包括自己)

select parentid,subid,level from zxtable
where 條件 
start with parentid='7' 
connect by subid = prior parentid           
上一篇: 每日學習
下一篇: 每日學習