最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Oracle遞歸查詢簡單示例

 更新時間:2022年11月09日 10:30:23   作者:michael-linux  
最近在做一個樹狀編碼管理系統(tǒng),其中用到了oracle的樹狀遞歸查詢,下面這篇文章主要給大家介紹了關(guān)于Oracle遞歸查詢的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

1 數(shù)據(jù)準備

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, '中國');
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, '洛陽市');
insert into area_test (ID, PARENT_ID, NAME) values (114, 11, '新鄉(xiāng)市');
insert into area_test (ID, PARENT_ID, NAME) values (115, 11, '南陽市');
insert into area_test (ID, PARENT_ID, NAME) values (121, 12, '朝陽區(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é)點

select *
from area_test
start with name ='鄭州市'
connect by prior id=parent_id

2.2 查詢所有父節(jié)點

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é)點,這里可以用子結(jié)點的列,反之亦然。
connect by 子句:連接條件。prior 跟父節(jié)點列parentid放在一起,就是往父結(jié)點方向遍歷;prior 跟子結(jié)點列subid放在一起,則往葉子結(jié)點方向遍歷。parent_id、id兩列誰放在“=”前都無所謂,關(guān)鍵是prior跟誰在一起。
order by 子句:排序。

2.3 查詢指定節(jié)點的,根節(jié)點

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;

補充:實例

我們稱表中的數(shù)據(jù)存在父子關(guān)系,通過列與列來關(guān)聯(lián)的,這樣的數(shù)據(jù)結(jié)構(gòu)為樹結(jié)構(gòu)。

現(xiàn)在有一個menu表,字段有id,pid,title三個。

查詢菜單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是當前記錄id的記錄,如此順延找到所有子節(jié)點。

查詢菜單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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

开平市| 依兰县| 女性| 中江县| 疏附县| 衡山县| 梅河口市| 闵行区| 周宁县| 论坛| 临颍县| 洮南市| 稻城县| 杭锦旗| 屯昌县| 综艺| 宜昌市| 彭阳县| 章丘市| 寻甸| 襄樊市| 义马市| 富裕县| 嘉定区| 新巴尔虎左旗| 定南县| 潮州市| 信宜市| 德清县| 兰溪市| 陇西县| 庆阳市| 会宁县| 儋州市| 芜湖市| 涪陵区| 株洲县| 丹阳市| 海兴县| 额敏县| 绥德县|