天天看點

mysql connect by prior start with_start with connect by prior 遞歸查詢用法

這個子句主要是用于B樹結構類型的資料遞歸查詢,給出B樹結構類型中的任意一個結點,周遊其最終父結點或者子結點。

先看原始資料:

1 create tablea_test2 ( 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;

mysql connect by prior start with_start with connect by prior 遞歸查詢用法

對應B樹結構為:

mysql connect by prior start with_start with connect by prior 遞歸查詢用法

接下來看一個示例:

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

mysql connect by prior start with_start with connect by prior 遞歸查詢用法

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

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

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

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

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

下面看看往葉子結點周遊的例子:

mysql connect by prior start with_start with connect by prior 遞歸查詢用法

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

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

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

以查詢葉子結點(往下周遊)為例

mysql connect by prior start with_start with connect by prior 遞歸查詢用法

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

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

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

mysql connect by prior start with_start with connect by prior 遞歸查詢用法