這個子句主要是用於B樹結構類型的數據遞歸查詢,給出B樹結構類型中的任意一個結點,遍歷其最終父結點或者子結點。post
先看原始數據:spa
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樹結構爲:3d
接下來看一個示例:code
要求給出其中一個結點值,求其最終父結點。以7爲例,看一下代碼blog
start with 子句:遍歷起始條件,有個小技巧,若是要查父結點,這裏能夠用子結點的列,反之亦然。排序
connect by 子句:鏈接條件。關鍵詞prior,prior跟父節點列parentid放在一塊兒,就是往父結點方向遍歷;prior跟子結點列subid放在一塊兒,則往葉子結點方向遍歷,遞歸
parentid、subid兩列誰放在「=」前都無所謂,關鍵是prior跟誰在一塊兒。it
order by 子句:排序,不用多說。io
--------------------------------------------------table
下面看看往葉子結點遍歷的例子:
這裏start with 子句用了parentid列,具體區別後面舉例說明。
connect by 子句中,prior跟subid在同一邊,就是往葉子結點方向遍歷去了。由於7有兩個子結點,因此第一級中有兩個結果(10和11),10有兩個子結點(12,13),11無,因此第二級也有兩個結果(12,13)。即12,13就是葉子結點。
下面看下start with子句中選擇不一樣的列的區別:
以查詢葉子結點(往下遍歷)爲例
結果很明顯,原意是要以7爲父結點,遍歷其子結點,左圖取的是父結點列的值,結果符合原意;右圖取的是子結點列的值,結果多餘的顯示了7 的父結點3.
---------------------------------------
關於where條件的語句,之後驗證後再記錄。先留個疑問