Oracle中的遞迴查詢

2021-07-22 22:50:12 字數 1759 閱讀 1705

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

oracle中的遞迴查詢

oracle遞迴查詢 oracle中start by prior子句用法 connect by 是結構化查詢中用到的,其基本語法是 select from tablename start with 條件1 connect by 條件2 where 條件3 例 select from table st...

Oracle中遞迴查詢

表結構示例 示例資料 oracle當中的 connect by 是層次查詢子句,一般用於樹狀或者層次結果集的查詢。例如家族關係 組織管理等層次關係。每行資料都是按層次順序檢索,並規定將表中的資料連入樹形結構的關係中。select a.level,connect by isleaf from node...

oracle 遞迴查詢 Oracle遞迴查詢

1.1 建立表與插入資料 create table district id number 10 not null,parent id number 10 name varchar2 255 byte not null alter table district add constraint distr...