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

 

發佈了48 篇原創文章 · 獲贊 49 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章