广告
返回顶部
首页 > 资讯 > 数据库 >Oracle递归查询树形数据
  • 762
分享到

Oracle递归查询树形数据

oraclemysqlsql 2023-09-07 07:09:37 762人浏览 泡泡鱼
摘要

概述 实际生活有很多树形结构的数据,比如公司分为多个部门,部门下分为多个组,组下分为多个员工;省市县的归属;页面菜单栏等等。 如果想查询某个节点的父节点或者子节点,一般通过表自身连接完成,但如果该节点

概述

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

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

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.*,LEVELfrom area_test tstart with name ='郑州市'connect by prior id=parent_id

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

select * from area_test t1,area_test t2where t1.ID = t2.PARENT_ID and t1.NAME='郑州市'

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

select t.*,LEVELfrom area_test tstart 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.*,levelfrom area_test tstart with name ='郑州市'connect by prior t.parent_id=t.idorder by level asc;

2.3 查询指定节点的根节点

select d.*,   connect_by_root(d.id) rootid,   connect_by_root(d.name) rootnamefrom area_test dwhere name='二七区'start with d.parent_id IS NULLconnect by prior d.id=d.parent_id
select d.*,   connect_by_root(d.id) rootid,   connect_by_root(d.name) rootnamefrom area_test dstart with d.parent_id IS NULLconnect by prior d.id=d.parent_id

2.4 查询下行政组织递归路径

select id, parent_id, name, sys_connect_by_path(name, '->') namepath, levelfrom area_teststart 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递归查询

来源地址:https://blog.csdn.net/weixin_40017062/article/details/127653569

您可能感兴趣的文档:

--结束END--

本文标题: Oracle递归查询树形数据

本文链接: https://www.lsjlt.com/news/397829.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle递归查询树形数据
    概述 实际生活有很多树形结构的数据,比如公司分为多个部门,部门下分为多个组,组下分为多个员工;省市县的归属;页面菜单栏等等。 如果想查询某个节点的父节点或者子节点,一般通过表自身连接完成,但如果该节点...
    99+
    2023-09-07
    oracle mysql sql
  • Oracle递归查询树形数据实例代码
    目录概述1、数据准备2 start with connect by prior递归查询2.1 查询所有子节点2.2 查询所有父节点2.3 查询指定节点的根节点2.4 查询下行政组织递归路径3 with递归查询3.1 wi...
    99+
    2022-11-09
  • Java 递归查询部门树形结构数据的实践
    说明:在开发中,我们经常使用树形结构来展示菜单选项,如图: 那么我们在后端怎么去实现这样的一个功能呢? 1、数据库表:department 2、编写sql映射语句 &...
    99+
    2022-11-12
  • Mysql树形递归查询的实现方法
    前言 对于数据库中的树形结构数据,如部门表,有时候,我们需要知道某部门的所有下属部分或者某部分的所有上级部门,这时候就需要用到mysql的递归查询 最近在做项目迁移,Oracle版本的迁到Mysql版本,遇...
    99+
    2022-10-18
  • mysql递归查询树形结构怎么应用
    在MySQL中实现递归查询树形结构可以使用递归查询语句(Recursive Query Statement)或者使用存储过程来实现。...
    99+
    2023-10-25
    mysql
  • 怎么在Oracle中实现递归树形结构查询功能
    这篇文章给大家介绍怎么在Oracle中实现递归树形结构查询功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中...
    99+
    2022-10-18
  • Oracle递归查询
                    ----创建数...
    99+
    2022-10-18
  • sqlserver中怎么实现树形结构递归查询
    本篇文章为大家展示了sqlserver中怎么实现树形结构递归查询,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。公用表表达式(CTE),是一个在查询中定义的临时命名结...
    99+
    2022-10-18
  • java递归实现树形结构数据
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、树形结构是什么?二、实现方案1、stream流递归实现1.1 实体类1.2 实现类 2、jdk1.7以下实现2.1 节点类2.2 实现类...
    99+
    2023-08-18
    java 数据库 mysql
  • MyBatis实现两种查询树形数据的方法详解(嵌套结果集和递归查询)
    目录方法一:使用嵌套结果集实现1,准备工作2,实现代码方法二:使用递归查询实现    树形结构数据在开发中十分常见,比如:菜单数、组织树, 利用&nbs...
    99+
    2022-11-12
  • Mysql树形表的两种查询方案(递归与自连接)
    你有没有遇到过这样一种情况: 一张表就实现了一对多的关系,并且表中每一行数据都存在“爷爷-父亲-儿子-…”的联系,这也就是所谓的树形结构 对于这样的表很显然想要通过查询来实现价值绝对是不能只靠sel...
    99+
    2023-09-30
    mysql 数据库
  • Oracle递归查询简单示例
    目录1 数据准备2 start with connect by prior递归查询2.1 查询所有子节点2.2 查询所有父节点2.3 查询指定节点的,根节点2.4 查询巴中市下行政组织递归路径3 with递归查询3.1 ...
    99+
    2022-11-09
  • Oracle递归查询connect by用法
    目录一、概述1、层级查询的基本语法:二、使用1、基本用法2、SYS_CONNECT_BY_PATH() 函数3、CONNECT_BY_ISLEAF 伪列4、CONNECT_BY_RO...
    99+
    2022-11-13
  • oracle with 语句实现递归查询
    Oracle with 语句可以实现如同connect by 语句一样的序列:connect by用法使用rownum实现1到10的序列。select rownum from&...
    99+
    2022-10-18
  • Oracle递归查询的几种方法
    oracle的start with connect by prior是根据条件递归查询"树",分为四种使用情况:  第一种:start with 子节点ID='...' connect ...
    99+
    2022-10-18
  • 数据结构 二叉树的递归与非递归
    数据结构 二叉树的递归与非递归 实例代码: #include <iostream> #include <queue> #include <stack> #inc...
    99+
    2022-06-04
    递归 数据结构 与非
  • mysql怎样递归查询所有数据
    小编给大家分享一下mysql怎样递归查询所有数据,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql递归查询所有数据的方法:...
    99+
    2022-10-18
  • MySQL数据库的递归查询with recursive
    原因:         当我们在实际的开发流程中,我们会遇到需要递归查询的一些数据,例如:课程分类表是一个树型结构,其中parentid字段为父结点ID,它是树型结构的标志字段。 如果树的层级固定可以使用表的自链接去查询,比如:我们只查询两...
    99+
    2023-09-08
    sql 数据库
  • vue如何使用递归树形数据寻找对象
    这篇文章主要讲解了“vue如何使用递归树形数据寻找对象”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue如何使用递归树形数据寻找对象”吧!一、数据结构在开始介绍方法前,让我们先看一下常见的...
    99+
    2023-07-05
  • java递归实现树形结构数据完整案例
    目录前言一、树形结构是什么?二、实现方案1、stream流递归实现1.1 实体类1.2 实现类2、jdk1.7以下实现2.1 节点类2.2 实现类3、应用场景3.1 用于前端方便展示...
    99+
    2023-05-17
    Java遍历树形结构 java递归详解 java树形数据结构
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作