1. 程式人生 > >Oracle start with connect by prior... 遞歸查詢

Oracle start with connect by prior... 遞歸查詢

span into mage create level 結構 最終 1-1 pre

start with connect by prior 主要是用於B樹結構類型的數據遞歸查詢,給出B樹結構類型中的任意一個節點,遍歷其最終父節點或者子節點。

-- create table
create table prior_test
( parentid number(10),
  subid    number(10)
);
-- 字段類型最好用 number,而不是 varchar2,因為測試 SQL 需要比較 id

-- insert
insert into prior_test values ( 1, 2 );
insert into prior_test values ( 1, 3
); insert into prior_test values ( 2, 4 ); insert into prior_test values ( 2, 5 ); insert into prior_test values ( 3, 6 ); insert into prior_test values ( 3, 7 ); insert into prior_test values ( 5, 8 ); insert into prior_test values ( 5, 9 ); insert into prior_test values ( 7, 10 ); insert into prior_test values
( 7, 11 ); insert into prior_test values ( 10, 12 ); insert into prior_test values ( 10, 13 );

-- select
select * from prior_test

技術分享

-- SQL-1
select t.parentid, t.subid, level 
from prior_test t
start with t.subid = 7
connect by subid = prior parentid
order by level desc

技術分享

-- SQL-2
select t.parentid, t.subid, level
from prior_test t start with t.subid = 7 connect by prior subid = parentid order by level desc

技術分享

SQL 解析:

start with 子句:遍歷起始條件

connect by 子句:連接條件

  關鍵詞 prior,prior 跟父節點列 parentid 放在一起,prior parentid 就是往父節點方向遍歷;prior跟子節點列 subid 放在一起,prior subid 則往子節點方向遍歷。

  parentid、subid 兩列誰放在 ‘=‘ 前都無所謂,關鍵是 prior 後面的字段。(比較上面查詢語句 SQL-1 與 SQL-2)

order by 子句:排序

觀察下面 SQL-3 與 SQL-4 分別執行的結果集:

-- SQL-3
select t.parentid, t.subid, level 
from prior_test t
start with t.subid = 7
connect by prior subid = parentid
order by level desc

技術分享

-- SQL-4
select t.parentid, t.subid, level 
from prior_test t
start with t.parentid = 7
connect by prior subid = parentid
order by level desc

技術分享

結論:start with subid 與 start with parentid 結果集是不同的。

加入 where 子句

-- SQL-5
select t.parentid, t.subid, level from bb_test t
where t.parentid > 3
start with t.subid = 12
connect by subid = prior parentid
order by level desc

技術分享

SQL 執行順序是:先 start with 子句, 在是 connect by 子句, 最後是 where 子句!

where 只是樹結構的修剪,不改變樹的層次結構。

Oracle start with connect by prior... 遞歸查詢