Oracle 遞迴查詢

2021-06-22 12:02:38 字數 2738 閱讀 3700

所謂遞迴查詢就是「樹狀」查詢,即:

select ... from tablename start with cond1 connect by cond2 where cond3

簡單說來是將乙個樹狀結構儲存在一張表裡,比如乙個表中存在兩個字段:

id,parentid

那麼通過表示每一條記錄的

parent

是誰,就可以形成乙個樹狀結構。

用上述語法的查詢可以取得這棵樹的所有記錄。 其中

cond1

是根結點的限定語句,當然可以放寬限定條件,以取得多個根結點,實際就是多棵樹。

cond2

是連線條件,其中用

prior

表示上一條記錄,比如

connect by prior id=praentid

就是說上一條記錄的

id是本條記錄的

praentid

,即本記錄的父親是上一條記錄。

cond3

是過濾條件,用於對返回的所有記錄進行過濾。

prior

和start with

關鍵字是可選項

priory

運算子必須放置在連線關係的兩列中某乙個的前面。對於節點間的父子關係,

prior

運算子在一側表示父節點,在另一側表示子節點,從而確定查詢樹結構是的順序是自頂向下還是自底向上。

在連線關係中,除了可以使用列名外,還允許使用列表示式。

start with

子句為可選項,用來標識哪個節點作為查詢樹型結構的根節點。若該子句被省略,則表示所有滿足查詢條件的行作為根節點。

下面給出乙個例子:

create table sc_district

( iid number(10) not null,

parent_id number(10),

iname varchar2(255 byte) not null,

bz      number(4));

alter table sc_district add (

constraint sc_district_pk

primary key

(iid));

alter table sc_district add (

constraint sc_district_r01

foreign key (parent_id)

references sc_district (iid));

insert into sc_district(iid,iname) values(1,'四川省');

insert into sc_district(iid,parent_id,iname,bz) values(2,1,'巴中市',0);

insert into sc_district(iid,parent_id,iname,bz) values(3,1,'達州市',0);

insert into sc_district(iid,parent_id,iname,bz) values(4,2,'巴州區',0);

insert into sc_district(iid,parent_id,iname,bz) values(5,2,'通江縣',0);

insert into sc_district(iid,parent_id,iname,bz) values(6,2,'平昌縣',0);

insert into sc_district(iid,parent_id,iname,bz) values(7,3,'通川區',0);

insert into sc_district(iid,parent_id,iname,bz) values(8,3,'宣漢縣',0);

insert into sc_district(iid,parent_id,iname,bz) values(9,8,'塔河鄉',1);

insert into sc_district(iid,parent_id,iname,bz) values(10,8,'三河鄉',1);

insert into sc_district(iid,parent_id,iname,bz) values(11,8,'胡家鎮',1);

insert into sc_district(iid,parent_id,iname,bz) values(12,8,'南壩鎮',1);

insert into sc_district(iid,parent_id,iname,bz) values(13,6,'大寨鄉',2);

insert into sc_district(iid,parent_id,iname,bz) values(14,6,'響灘鎮',2);

insert into sc_district(iid,parent_id,iname,bz) values(15,6,'龍崗鎮',2);

insert into sc_district(iid,parent_id,iname,bz) values(16,6,'白衣鎮',2);

select * from sc_district

start with iname = '平昌縣'

connect by prior iid = parent_id

select * from sc_district

start with iname = '平昌縣'

connect by prior parent_id= iid

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...

oracle 逆向遞迴查詢 oracle遞迴查詢

oracle的遞迴查詢 最近在看公司的oa系統,oa系統中基本都會有節點樹,其中對於樹上的資料展示,就是用了資料庫的遞迴查詢,在這裡總結下遞迴查詢。現在存在如下的一棵樹 不會畫樹,將就一下,該樹對應下面建立的表資料。建立如下表 create table dg id number not null,主...

oracle 逆向遞迴查詢 Oracle遞迴查詢

start with.connect by子句遞迴查詢一般用於乙個表維護樹形結構的應用。建立示例表 create table tbl test id number,name varchar2 100 byte pid number default 0 插入測試資料 insert into tbl t...