Oracle遞歸查詢簡(jiǎn)單示例
1 數(shù)據(jù)準(zhǔn)備
create table area_test( id number(10) not null, parent_id number(10), name varchar2(255) not null ); alter table area_test add (constraint district_pk primary key (id)); insert into area_test (ID, PARENT_ID, NAME) values (1, null, '中國(guó)'); insert into area_test (ID, PARENT_ID, NAME) values (11, 1, '河南省'); insert into area_test (ID, PARENT_ID, NAME) values (12, 1, '北京市'); insert into area_test (ID, PARENT_ID, NAME) values (111, 11, '鄭州市'); insert into area_test (ID, PARENT_ID, NAME) values (112, 11, '平頂山市'); insert into area_test (ID, PARENT_ID, NAME) values (113, 11, '洛陽(yáng)市'); insert into area_test (ID, PARENT_ID, NAME) values (114, 11, '新鄉(xiāng)市'); insert into area_test (ID, PARENT_ID, NAME) values (115, 11, '南陽(yáng)市'); insert into area_test (ID, PARENT_ID, NAME) values (121, 12, '朝陽(yáng)區(qū)'); insert into area_test (ID, PARENT_ID, NAME) values (122, 12, '昌平區(qū)'); insert into area_test (ID, PARENT_ID, NAME) values (1111, 111, '二七區(qū)'); insert into area_test (ID, PARENT_ID, NAME) values (1112, 111, '中原區(qū)'); insert into area_test (ID, PARENT_ID, NAME) values (1113, 111, '新鄭市'); insert into area_test (ID, PARENT_ID, NAME) values (1114, 111, '經(jīng)開區(qū)'); insert into area_test (ID, PARENT_ID, NAME) values (1115, 111, '金水區(qū)'); insert into area_test (ID, PARENT_ID, NAME) values (1121, 112, '湛河區(qū)'); insert into area_test (ID, PARENT_ID, NAME) values (1122, 112, '舞鋼市'); insert into area_test (ID, PARENT_ID, NAME) values (1123, 112, '寶豐市'); insert into area_test (ID, PARENT_ID, NAME) values (11221, 1122, '尚店鎮(zhèn)');
2 start with connect by prior遞歸查詢
2.1 查詢所有子節(jié)點(diǎn)
select * from area_test start with name ='鄭州市' connect by prior id=parent_id

2.2 查詢所有父節(jié)點(diǎn)
select t.*,level from area_test t start with name ='鄭州市' connect by prior t.parent_id=t.id order by level asc;

start with 子句:遍歷起始條件,如果要查父結(jié)點(diǎn),這里可以用子結(jié)點(diǎn)的列,反之亦然。
connect by 子句:連接條件。prior 跟父節(jié)點(diǎn)列parentid放在一起,就是往父結(jié)點(diǎn)方向遍歷;prior 跟子結(jié)點(diǎn)列subid放在一起,則往葉子結(jié)點(diǎn)方向遍歷。parent_id、id兩列誰(shuí)放在“=”前都無(wú)所謂,關(guān)鍵是prior跟誰(shuí)在一起。
order by 子句:排序。
2.3 查詢指定節(jié)點(diǎn)的,根節(jié)點(diǎn)
select d.*, connect_by_root(d.id) rootid, connect_by_root(d.name) rootname from area_test d where name='二七區(qū)' start with d.parent_id IS NULL connect by prior d.id=d.parent_id

2.4 查詢巴中市下行政組織遞歸路徑
select id, parent_id, name, sys_connect_by_path(name, '->') namepath, level from area_test start with name = '平頂山市' connect by prior id = parent_id

3 with遞歸查詢
3.1 with遞歸子類
with tmp(id, parent_id, name)
as (
select id, parent_id, name
from area_test
where name = '平頂山市'
union all
select d.id, d.parent_id, d.name
from tmp, area_test d
where tmp.id = d.parent_id
)
select * from tmp;

3.2 遞歸父類
with tmp(id, parent_id, name) as ( select id, parent_id, name from area_test where name = '二七區(qū)' union all select d.id, d.parent_id, d.name from tmp, area_test d where tmp.parent_id = d.id ) select * from tmp;

補(bǔ)充:實(shí)例
我們稱表中的數(shù)據(jù)存在父子關(guān)系,通過(guò)列與列來(lái)關(guān)聯(lián)的,這樣的數(shù)據(jù)結(jié)構(gòu)為樹結(jié)構(gòu)。
現(xiàn)在有一個(gè)menu表,字段有id,pid,title三個(gè)。

查詢菜單id為10的所有子菜單。
SELECT * FROM tb_menu m START WITH m.id=10 CONNECT BY m.pid=PRIOR m.id;

將PRIOR關(guān)鍵字放在m.id前面,意思就是查詢pid是當(dāng)前記錄id的記錄,如此順延找到所有子節(jié)點(diǎn)。
查詢菜單id為40的所有父菜單。
SELECT * FROM tb_menu m START WITH m.id=40 CONNECT BY PRIOR m.pid= m.id ORDER BY ID;

總結(jié)
到此這篇關(guān)于Oracle遞歸查詢的文章就介紹到這了,更多相關(guān)Oracle遞歸查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle根據(jù)時(shí)間查詢的一些常見(jiàn)情況匯總
根據(jù)時(shí)間查詢是我們?nèi)粘i_發(fā)中經(jīng)常會(huì)遇到的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于Oracle根據(jù)時(shí)間查詢的一些常見(jiàn)情況,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
Oracle START WITH 遞歸語(yǔ)句的使用方法
Oracle數(shù)據(jù)庫(kù)中的START WITH語(yǔ)句經(jīng)常與CONNECT BY子句一起使用,以實(shí)現(xiàn)對(duì)層次型數(shù)據(jù)的查詢,本文主要介紹了Oracle START WITH 遞歸語(yǔ)句的使用方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
解決Oracle刪除重復(fù)數(shù)據(jù)只留一條的方法詳解
本篇文章是對(duì)Oracle刪除重復(fù)數(shù)據(jù)只留一條的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Oracle數(shù)據(jù)完整性和鎖機(jī)制簡(jiǎn)析
事務(wù)不是程序,事務(wù)和程序分屬兩個(gè)概念,事務(wù)控制語(yǔ)句稱為TCL,一般包括Commit和Rollback,需要了解的朋友可以參考下2012-11-11

