1. 程式人生 > >Oracle中的遞迴查詢

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 語句後面的條件“=”兩邊的條件順序直接影響著結果!