Oracle中的遞迴查詢
我們假設有如下一張機構表(ORG):
欄位型別 |
欄位名稱 |
欄位描述 |
NUMBER(16) |
ID |
機構ID |
NUMBER(16) |
PARENT_ID |
父機構ID |
VARCHAR2(100) |
NAME |
機構名稱 |
NUMBER(1) |
ENABLE |
是否啟用,1表示啟用,0表示停用 |
表中有如下幾行資料:
ID |
PARENT_ID |
NAME |
ENABLE |
1314 |
1399 |
信用卡後勤保障部 |
1 |
1399 |
5000 |
信用卡後勤部 |
1 |
1414 |
5000 |
信用卡業務部 |
0 |
5000 |
8888 |
信用卡總部 |
1 |
8888 |
9000 |
銀行卡總部 |
1 |
9000 |
10000 |
業務部 |
1 |
10000 |
-1 |
總部 |
1 |
在Oracle中,我們可以採用如下語句來進行遞迴查詢:
select ID, PARENT_ID from ORG where [條件列表1] start with [遞迴起始條件] connect by prior [遞迴條件]
其中,條件列表1用來對查詢出的所有的資料進行過濾,遞迴起始條件用於定義遞迴資料的起點,而遞迴條件用於定義遞迴的規則。
對於上面提到的ORG表,如果我們想查出信用卡後勤部的ID和它的所有啟用的上級機構的ID,就可以用如下語句:
select ID from ORG where ENABLE = 1 start with ID = 1399 connect by prior PARENT_ID = ID
如上,我們要查的所有機構必須是啟用的,所以在where語句後面加了ENABLE = 1這一全域性條件,信用卡後勤部的機構ID為1399,所以我們在start with語句後面加了ID = 1399,我們得根據這個ID行的PARENT_ID來找出其父機構,又要根據其父機構的 PARENT_ID來找出父機構的父機構,以此類推,所以我們在connect by prior 語句後面加了PARENT_ID = ID。
下面給出查詢結果:
ID |
1399 |
5000 |
8888 |
9000 |
10000 |
你可能會想到,如果把 connect by prior 語句後面的條件寫成 ID = PARENT_ID,結果會怎樣呢?
請看如下語句的結果:
select ID from ORG where ENABLE = 1 start with ID = 1399 connect by prior ID = PARENT_ID
ID |
1399 |
1314 |
你想的沒錯!它把信用卡後勤部及其下屬部門的機構ID都查出來了,所以connect by prior 語句後面的條件“=”兩邊的條件順序直接影響著結果!