Oracle递归查询树形数据

news2024/11/25 12:48:16

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一题 2258. 逃离火灾(手撕困难!!!)

火会扩散,但是我们可以看作火不会扩散到已经着火的格子,这样我们就可以记录每一个为草地的格子的着火时间在代码中,因为数字 2 已经表示墙了,所以我们把当时间为 0 时着火的格子在 gird 中的值设为 3,时间为 1 时着火的…

YOLOv8教程系列:五、关闭数据增强

YOLOv8教程系列:五、关闭数据增强 在一些特殊情况下,特别是在计算机视觉任务中,如目标检测,图像的颜色扰动可能会对算法的性能和稳定性产生重要影响。在这些情况下,我们可能需要采取一些措施来关闭部分或全部的数据增…

招商银行余额截图生成器在线,虚拟金额中国农业邮政建设工商,易语言开源例子

其实用易语言的画板写一个图片生成器真的非常简单,我这里都没用任何第三方的支持库,当然也可以用EXUI画板自绘功能,但是用这个默认的就足够了,而且画出来的图非常高清,软件框架里面比较模糊因为缩放的原因,…

调试 Mahony 滤波算法的思考 10

调试 Mahony 滤波算法的思考 1. 说在前面的2.Mahony滤波算法的核心思想3. 易懂的理解 Mahony 滤波算法的过程4. 其他的一些思考5. 民间 9轴评估板 1. 说在前面的 之前调试基于QMI8658 6轴姿态解算的时候,我对Mahony滤波的认识还比较浅薄。初次的学习和代码的移植让…

EMNLP2023 | 让模型学会将提示插入到合适的中间层

深度学习自然语言处理 原创作者:cola 现有的提示微调方法基本是人工选择提示层,而人工选择将提示插入到哪些层次并非一定合理,这导致了很大程度上限制提示微调发挥潜能。我们的模型(SPT)可以让模型自己学习应该在哪些中间层插入提示&#xff…

强化您的应用安全,从app加固开始

强化您的应用安全,从app加固开始 目录 强化您的应用安全,从app加固开始 摘要 引言 1. 加密和数据保护 2. 代码混淆 3. 防止反编译 4. 安全测试 5. 更新和补丁 6. 权限控制 7. 输入验证和输出过滤 8. 日志记录和监控 9. 安全设计和架构 10.…

【Python】AppUI自动化—appium自动化开发环境部署、APP测试案例(17)上

文章目录 一.appium简介1.什么是appium2.appium 的工作原理3.APP类型4.APP页面布局 二,appium开发环境部署(python环境)1.下载安装环境1.1.下载安装所需环境1.2.Appium-desktop( Appium-Server-GUI )配置1.3.Appium-Inspector 配置…

【Delphi】Android 开发HTTP请求出错解决方案

目录 一、故障现象 二、原因及解决方案 一、故障现象 在android内建的WebBrowser浏览器中通过http访问一个网站(注意不是https),出现如下错误提示: 在使用ntfy的时候,访问http定义的服务器地址(注意不是…

通过postgis空间库导入sql格式的矢量数据到arcgis中

1、在postgis中创建数据库 命名为test3 2、创建空间扩展 3、导入sql矢量文件 进入psql.exe目录中 进入dos命令框中 输入命令,其中host输入自己的主机ip,database为自己的数据库名称,数据路径修改为自己电脑上的路径,注意反斜杠 psql

github官网打不开或访问慢的解决办法

对国内程序员而言,github官网经常面临打不开或访问慢的问题,今天教你一招非常简单且好用的小技巧,轻松访问github官网。 1、github官网打不开的原因 首选我们说下github官网打不开的原因到底是什么。细心的同学会发现,github偶尔…

SDL2 简单介绍以及Windows开发环境搭建

1.简介 SDL(Simple DirectMedia Layer)是一个跨平台的多媒体开发库,使用C语言写成,用于实现音频、图形、输入以及窗口功能的处理。它提供了一个简单、易用的API,可以帮助开发者快速构建跨平台的多媒体应用程序。 SDL…

国外访问学者/博士后留学人员反诈骗指南

访问学者/博士后/联合培养博士人员出国后,对当地环境及政策不熟悉,需要提高防范意识,为此,知识人网小编特整理这篇反诈骗指南,提醒留学人员防微杜渐、未雨绸缪。 近日,多国使馆发布相关提醒:不法…

kali linux系统选用gnome桌面安装完成后无法调节屏幕亮度踩坑过程( 2301_77564090)

方法一: 在终端通过xrandr命令查看当前显示屏名字 然后输入命令调节屏幕亮度,我调节的是原先的70%, xrandr --output eDP --brightness 0.7 方法一能成功调节,但每次开机屏幕亮度都自动回调到100%,每次都要手动打开终…

5G毫米波通信中的关键技术

随着5G技术的快速发展,毫米波通信作为其中的一项重要技术,在高速数据传输、低延迟通信和大规模连接等方面具有显著的优势。本文将探讨5G毫米波通信中的关键技术,包括毫米波频段的选择、信号处理技术和MIMO技术等。 一、毫米波频段的选择 毫米…

Node版本管理工具——Nvm

文章目录 前言基础常识彼此之间的关系 一、安装 nvm?查看是否安装成功 二、配置下载源三、nvm常用命令 前言 nvm 全名 node.js version management,顾名思义是一个nodejs的版本管理工具。通过它可以安装和切换不同版本的nodejs。 基础常识 node&#x…

掌握互联网的未来:5G时代的新机遇

随着5G技术的快速发展,我们正步入一个全新的互联网时代。5G不仅仅是速度的飞跃,它还代表着无限的可能性和前所未有的创新机遇。本文将探讨5G如何重新定义互联网,并为您提供洞察如何抓住这波科技浪潮。 5G技术的核心优势 超高速度&#xff1a…

Git的安装和常用命令Git与SVN的区别Gitee远程仓库团队开发代码共享演示

目录 一、Git入门 1.1 Git简介 1.2 Git与SVN的区别 1.2.1 详解 1.2.2 图解 1.3 Git相较于SVN的优势与劣势 1.3.1 Git的优势与劣势 1.3.2 SVN的优势与劣势 1.4 Git的工作流程 1.4.1 图解 1.4.2 详解 二、Git的安装以及常用命令 2.1 Git官网链接 2.2 安装步骤 2.…

国产小体积超低成本电动车仪表智能刷卡解锁13.56M非接触式读写芯片CI522兼容替代RC522

Ci522电动车仪表一键启动芯片 Ci522是一个高度集成的,工作在13.56MHz的非接触式读写器芯片,阅读器支持ISO/IEC 14443 A/MIFARE。 无需外围其他电路,Ci522的内部发送器可驱动读写器天线与ISO/IEC 14443 A/MIFARE卡和应答机通信。接收器模块提…

基于【宝塔+NPS】内网穿透搭建教程

下载服务端 https://github.com/ehang-io/nps/releases 我这里选择linux_amd64_server.tar.gz 执行安装命令 sudo ./nps install安装后修改/etc/nps/conf下的文件不是解压里的 然后修改里面的4处内容 宝塔docker 安装 nps 运行 nps 容器,并设置开机自启动 docke…

基于springboot实现高校党务平台管理系统【项目源码】计算机毕业设计

基于springboot实现高校党务平台管理系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点,而且Java是开源的,拥有全世界最大的开发者专业社群&#x…