我們假設有如下一張機構表(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 語句後面的條件“=”兩邊的條件順序直接影響着結果!