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

start with connect by prior 遞歸查詢用法

nec 示例 pos tab mage log int border 在一起

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

先看原始數據:

技術分享圖片
 1 create table a_test
 2 ( parentid varchar2(10),
 3   subid    varchar2(10));
 4 
 5 insert into a_test values ( ‘1‘, ‘2‘ );
 6 insert into a_test values ( ‘1‘, ‘3‘ );
 7 insert into a_test values ( ‘2‘, ‘4‘ );
 8 insert into a_test values ( ‘2‘, ‘5‘ );
 9 insert into a_test values ( ‘3‘, ‘6‘ );
10 insert into a_test values ( ‘3‘, ‘7‘ );
11 insert into a_test values ( ‘5‘, ‘8‘ );
12 insert into a_test values ( ‘5‘, ‘9‘ );
13 insert into a_test values ( ‘7‘, ‘10‘ );
14 insert into a_test values ( ‘7‘, ‘11‘ );
15 insert into a_test values ( ‘10‘, ‘12‘ );
16 insert into a_test values ( ‘10‘, ‘13‘ );
17 
18 commit;
19 
20 select * from a_test;
技術分享圖片

技術分享圖片

對應B樹結構為:

技術分享圖片


接下來看一個示例:

要求給出其中一個結點值,求其最終父結點。以7為例,看一下代碼

技術分享圖片

start with 子句:遍歷起始條件,有個小技巧,如果要查父結點,這裏可以用子結點的列,反之亦然。

connect by 子句:連接條件。關鍵詞prior,prior跟父節點列parentid放在一起,就是往父結點方向遍歷;prior跟子結點列subid放在一起,則往葉子結點方向遍歷,

parentid、subid兩列誰放在“=”前都無所謂,關鍵是prior跟誰在一起。

order by 子句:排序,不用多說。

--------------------------------------------------

下面看看往葉子結點遍歷的例子:

技術分享圖片

這裏start with 子句用了parentid列,具體區別後面舉例說明。

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





下面看下start with子句中選擇不同的列的區別:

以查詢葉子結點(往下遍歷)為例

技術分享圖片

結果很明顯,原意是要以7為父結點,遍歷其子結點,左圖取的是父結點列的值,結果符合原意;右圖取的是子結點列的值,結果多余的顯示了7 的父結點3.

---------------------------------------

關於where條件的語句,以後驗證後再記錄。先留個疑問

技術分享圖片


至於上邊的問題就簡單了。結果集是正確的,只是建表語句有問題,導致沒出現預想中的結果。

1 2 3 4 5 6 7 8 9 10 表字段,varchar2 和 number 的原因 create table aa_test ( parentid varchar2(10), subid varchar2(10) ); create table bb_test ( parentid number(10), subid number(10) );


對於 aa_test 表,where t.parents>‘3‘,這是字符串比較,‘10‘是小於‘3‘的。
對於 bb_test 表,where t.parent>3,這是 number類型比較。

start with connect by prior 遞歸查詢用法