我們假設有如下一張機構表(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...