Oracle递归查询树形数据实例代码

目录
  • 概述
  • 1、数据准备
  • 2 start with connect by prior递归查询
    • 2.1 查询所有子节点
    • 2.2 查询所有父节点
    • 2.3 查询指定节点的根节点
    • 2.4 查询下行政组织递归路径
  • 3 with递归查询
    • 3.1 with递归子类
    • 3.2 递归父类
  • 4 MySQL 递归查找树形结构
  • 总结

概述

实际生活有很多树形结构的数据,比如公司分为多个部门,部门下分为多个组,组下分为多个员工;省市县的归属;页面菜单栏等等。

如果想查询某个节点的父节点或者子节点,一般通过表自身连接完成,但如果该节点的子节点还有多层结构,就需要使用递归调用。但如果数据量特别大,递归的次数指数级上升,而且查询数据库的次数也指数级上升,导致程序和数据库压力剧增,查询时间特别长。那数据库有没有递归查询语句呢?答案是肯定的。

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递归查询

  • start with 子句:遍历起始条件。如果要查父结点,这里可以用子结点的列,反之亦然。
  • connect by 子句:连接条件。prior 跟父节点列parentid放在一起,就是往父结点方向遍历;prior 跟子结点列subid放在一起,则往叶子结点方向遍历。parent_id、id两列谁放在 “=” 前都无所谓,关键是prior跟谁在一起。
  • order by 子句:排序。

常用的select项:

LEVEL:级别
connect_by_root:根节点
sys_connect_by_path:递归路径

2.1 查询所有子节点

select t.*,LEVEL
from area_test t
start with name ='郑州市'
connect by prior id=parent_id

其实,如果单层结构,使用表自身连接也可以实现:

select * from area_test t1,area_test t2
where t1.PARENT_ID = t2.ID and t2.name='郑州市';

当查询节点下有多层数据:

select t.*,LEVEL
from area_test t
start with name ='河南省'
connect by prior id=parent_id

select * from area_test t1,area_test t2
where t1.PARENT_ID = t2.ID and t2.name='河南省';

如果使用自身连接,也只能查到子一级节点的数据,需要遍历子一级节点,递归查询每个子一级节点下的子节点。明显麻烦很多!!!

2.2 查询所有父节点

select t.*,level
from area_test t
start with name ='郑州市'
connect by prior t.parent_id=t.id
order by level asc;

2.3 查询指定节点的根节点

select d.*,
	   connect_by_root(d.id) rootid,
	   connect_by_root(d.name) rootname
from area_test d
where name='二七区'
start with d.parent_id IS NULL
connect by prior d.id=d.parent_id

select d.*,
	   connect_by_root(d.id) rootid,
	   connect_by_root(d.name) rootname
from area_test d
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 = '二七区'
   union all
   select d.id, d.parent_id, d.name
   from tmp, area_test d
   where tmp.parent_id = d.id
   )
select * from tmp;

4 MySQL 递归查找树形结构

参考文章:MySQL 递归查找树形结构,这个方法太实用了

参考文章:Oracle递归查询

总结

到此这篇关于Oracle递归查询树形数据的文章就介绍到这了,更多相关Oracle递归查询树形数据内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Oracle递归树形结构查询功能

    oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的. 概要:树状结构通常由根节点.父节点.子节点和叶节点组成,简单来说,一张表中存在两个字段,dept_id,par_dept_id,那么通过找到每一条记录的父级id即可形成一个树状结构,也就是par_dept_id(子)=dept_id(父),通俗的说就是这条记录的par_dept_id是另外一条记录也就是父级的dept_id,其树状结构层级查询的基本语法是: SELECT [

  • Oracle递归查询树形数据实例代码

    目录 概述 1.数据准备 2 start with connect by prior递归查询 2.1 查询所有子节点 2.2 查询所有父节点 2.3 查询指定节点的根节点 2.4 查询下行政组织递归路径 3 with递归查询 3.1 with递归子类 3.2 递归父类 4 MySQL 递归查找树形结构 总结 概述 实际生活有很多树形结构的数据,比如公司分为多个部门,部门下分为多个组,组下分为多个员工:省市县的归属:页面菜单栏等等. 如果想查询某个节点的父节点或者子节点,一般通过表自身连接完成,但

  • 利用Oracle数据库发送邮件的实例代码

    --发送邮件的主过程如下所述: Procedure send_mail_ (p_From Varchar2, --邮件发送人 p_Fromuser Varchar2, --发件人昵称 p_Touser Varchar2, --接受人昵称 p_To Varchar2, --邮件接收人 p_Cc Varchar2, --邮件抄送人 p_Subject Varchar2, --邮件标题 p_Message Varchar2, --邮件内容 p_User Varchar2, --邮件验证用户 p_Mai

  • mybatis实现读取树结构数据实例代码

    mybatis实现读取树结构数据详细介绍如下所示: 表结构 CREATE TABLE `lscrm_function_privilege` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '编号', `create_id` varchar(30) NOT NULL DEFAULT 'sys', `update_id` varchar(30) NOT NULL DEFAULT 'sys', `create_time` timestam

  • PHP无限循环获取MySQL中的数据实例代码

    最近公司有个需求需要从MySQL获取数据,然后在页面上无线循环的翻页展示.主要就是一直点击一个按钮,然后数据从最开始循环到末尾,如果末尾的数据不够了,那么从数据的最开始取几条补充上来. 其实,这个功能可以通过JQ实现,也可以通过PHP + MYSQL实现,只不过JQ比较方便而且效率更高罢了. 每次显示10条数据. public function get_data($limit){ $sql="select * from ((select id,name from `mytable` limit

  • app 请求服务器json数据实例代码

    请求服务器json数据格式代码,详细如下: var url=obj.serUrl; //此处为请求服务器的路径url,放上自己的请求路径: var data = {//date里面携带参数,根据服务器要求填写好参数,看清楚是字符串类型,还是整型. action:'getUser', username:loginInfowode, password:passwordwode }; //以下就是进入ajax请求服务器数据: mui.ajax({ type:"post",//请求格式,分为p

  • oracle索引的测试实例代码

    前言 在测试oracle索引性能时大意了,没有仔细分析数据特点,将情况特此记录下来. 需求:  对一张100w记录的表的 stuname列进行查询,测试在建立索引与不建立索引的区别. 以下是开始用的创建代码及执行效果. 1. 随机数据生成代码分析 --为测试索引而准备的随机数据生成代码,先分析一下 select rownum as id, 'smith'||trunc(dbms_random.value(0, 100)) as stu_name, dbms_random.string('x',

  • oracle bbed恢复删除数据实例

    恢复己删除数据一.创建模拟环境 复制代码 代码如下: SQL> create table hr.xifenfei (id number,name varchar2(20)) tablespace xff;Table created.SQL> insert into hr.xifenfei values(1,'xifenfei');1 row created.SQL> insert into hr.xifenfei values(2,'xff');1 row created.SQL>

  • Jquery异步请求数据实例代码

    一.Jquery向aspx页面请求数据 前台页面JS代码: 复制代码 代码如下: $("#Button1").bind("click", function () { $.ajax({ type: "post", url: "default.aspx", data: "name=" + $("#Text1").val(), success: function (result) { aler

  • 利用Python第三方库xlrd读取Excel中数据实例代码

    目录 1. 安装 xlrd 库 2. 使用 xlrd 库 2.1 打开 Excel 工作表对象 2.2 读取单个单元格数据 2.3 读取多个单元格数据 2.3 读取所有单元格数据 附:行.列操作 3. 总结 1. 安装 xlrd 库 Python 读取 Excel 中的数据主要用到 xlrd 第三方库.xlrd 其实就是两个单词的简化拼接,我们可以把它拆开来看,xl 代表 excel, rd 代表 read, 合并起来就是 xlrd, 意思就是读 excel 的第三方库. 这种命名风格也正是我们

  • vue中实现当前时间echarts图表时间轴动态的数据(实例代码)

    代码如下所示: <!-- ! 废话不多说,直接看代码吧 ! --> <template> <div class=""> <div class="chart" ref="ref_chart" style="width:370px;height:250px;"> </div> </div> </template> <script lang=&

随机推荐