当前位置: 首页 > news >正文

Oracle递归查询树形数据

实际生活有很多树形结构的数据,比如公司分为多个部门、部门下分为多个组,组下分为多个员工;省市县的归属;页面菜单栏等等。
如果想查询某个节点的父节点或者子节点,一般通过表自身连接完成,但如果该节点的子节点还有很多层结构,就需要使用递归调用。但如果数据量特别大,递归的次数指数级上升,而且查询数据库的次数也指数级上升,导致程序和数据库压力剧增,查询时间特别长。
start with connect by prior 递归查询
1、数据准备

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, '新乡市');
insert into area_test (ID, PARENT_ID, NAME) values (115, 11, '南阳市');
insert into area_test (ID, PARENT_ID, NAME) values (121, 12, '朝阳区');
insert into area_test (ID, PARENT_ID, NAME) values (122, 12, '昌平区');
insert into area_test (ID, PARENT_ID, NAME) values (1111, 111, '二七区');
insert into area_test (ID, PARENT_ID, NAME) values (1112, 111, '中原区');
insert into area_test (ID, PARENT_ID, NAME) values (1113, 111, '新郑市');
insert into area_test (ID, PARENT_ID, NAME) values (1114, 111, '经开区');
insert into area_test (ID, PARENT_ID, NAME) values (1115, 111, '金水区');
insert into area_test (ID, PARENT_ID, NAME) values (1121, 112, '湛河区');
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, '尚店镇');

2、start with connect by prior 递归 查询 [ˈpraɪə®] 先前的

1)start whit 子句:遍历起始条件。如果要查父节点,这里可以用子节点的列,反之则反。
2)connect by 子句:连接条件。prior跟父节点列parent_id放在一起。就是往父节点方向遍历。prior跟子节点列sub_id放在一起,则往叶子节点方向遍历。parent_id、id两列谁放在“=”前都无所谓,关键是prior跟谁在一起。
3)order by 子句:排序
常用的select项:
level:级别
connect_by_root:根节点
sys_connect_by_path:递归路径
在这里插入图片描述

其实,如果单层结构,使用表自身连接也可以实现:
在这里插入图片描述

2、查询所有父节点
在这里插入图片描述

3、查询指定节点的根节点
在这里插入图片描述

3、with递归查询
3.1 with递归子类
WITH TMP /*(id, parent_id, name) */
AS
(SELECT ID, PARENT_ID, NAME FROM AREA_TEST WHERE NAME = ‘平顶山市’)
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

3.2 with递归父类

http://www.lryc.cn/news/223651.html

相关文章:

  • pycharm pro v2023.2.4(Python开发)
  • 武汉某母婴用品公司 - 集简云连接ERP和营销系统,实现库存管理的自动化
  • AD9371 Crossbar
  • 设计模式 -- 责任链模式(Chain of Responsibility Pattern)
  • 开源:特殊的垄断
  • linux安装oracle client解决cx_Oracle.DatabaseError: DPI-1047
  • 工业园区一般用多大规格的电表?
  • Debian12换镜像源
  • deeplog中输出某个 event 的概率
  • 流媒体中relay和forword的区别
  • git创建本地分支并提交到远程
  • Selenium定位元素的方法css和xpath的区别
  • 【目标检测】SSD损失函数详解
  • C【整数正序分解】
  • 基于springboot实现高校党务平台管理系统【项目源码】计算机毕业设计
  • Day24力扣打卡
  • 5G-A 商用加速,赋能工业互联网
  • 代码随想录day2
  • UML/SysML建模工具更新(2023.10)(1)StarUML、Software Ideas Modeler
  • kubectl 资源管理命令-陈述式
  • 【紫光同创国产FPGA教程】——【PGL22G第九章】HDMI环路实验例程
  • IDEA Plugin插件开发相关踩坑
  • 汽车标定技术(八)--MPC57xx是如何支持标定的页切换
  • Ubuntu中增加交换内存
  • 一文带您了解云渲染
  • 分享4个MSVCP100.dll丢失的解决方法
  • 国际腾讯云服务器流量收费准分析!!
  • Redis系列-四种部署方式-单机部署+主从模式+哨兵模式【7】
  • Webpack 的作用和工作原理是什么?
  • ros1 实现Server端自定义四 Topic模式控制海龟运动