Oracle树形表和递归查询

华为OD机试2025C卷 - 字符串解密 (C++ & Python & JAVA & JS & GO) 华为OD机试 2025C卷 字符串解密,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解 阅读详情

       在平常的业务系统开发中,我们经常需要设计数据层次关系,如在经典的user-role-permission权限设计中, 需要对权限表的数据设计成一种层次依赖关系,如最顶层的为系统管理,系统管理的下一层为角色 管理,角色管理的下一层又为角色的CRUD操作, 那么这种表就可以抽象成为数据结构里面的B树. 如下表 :

CREATE TABLE "U_PERMISSION" 
   (	"ID" NUMBER(20,0), 
	"URL" VARCHAR2(256 BYTE), 
	"NAME" VARCHAR2(50 BYTE), 
	"PARENT" NUMBER(20,0)
   ) 

在上表中 id表示当前树的节点。url, name表示可访问的url路径,name表示url描述。 parent表示当前节点的父节点,如果当前节点是跟节点则parent用0表示(别用NULL违反了数据库约束)。 那么上面的表就可以抽象成如下图.




接着我们插入测试数据 :

Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (1,'*','系统管理',0);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (2,'*','权限管理',1);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (20,'/role/allocation','角色分配',23);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (4,'/permission/index','权限列表',2);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (6,'/permission/addPermission.shtml','权限添加',2);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (7,'/permission/deletePermissionById','权限删除',2);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (8,'/member/list.shtml','用户列表',22);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (9,'/member/online.shtml','在线用户',22);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (10,'/member/changeSessionStatus','用户Session踢出',22);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (11,'/member/forbidUserById','用户激活or禁止',22);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (12,'/member/deleteUserById','用户删除',22);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (13,'/permission/addPermission2Role','权限分配',2);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (14,'/role/clearRoleByUserIds','用户角色分配清空',23);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (15,'/role/addRole2User','角色分配保存',23);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (16,'/role/deleteRoleById.shtml','角色列表删除',23);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (17,'/role/addRole','角色列表添加',23);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (18,'role/index','角色列表',23);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (19,'/permission/allocation','权限分配2',2);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (22,'*','用户管理',1);
Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (23,'*','角色管理',1);

既然都已经创建树形表了那么肯定要对树进行操作。就像我们在大学的数据结构一书中所做的那样对树进行递归遍历(前序,中序,后序. 忘记了的面壁....) 在oralce中通过

start with....connect by...prior语法,依托该语法我们就可以对上面树形表进行递归遍历。

示例:

  给出一个节点的值,求出的他父节点和祖宗节点:


       

start with子句: 递归的条件,需要注意的是如果with后面的值是子节点那么求出的就是他的父节点和祖宗节点,如果是父节点那么求出的就是他的子节点和子孙节点,

                             如果不懂可以把上面start with 后面的条件改成 p.parent=0,就可以理解了。


connect by子句:连接条件。 关键词prior,prior跟它右边的父节点放在一起(prior p.parent)表示往父节点方向遍历, 反之,如果 prior跟子节点放在一起(prior p.id)表示往

                             叶子方向遍历。 这里需要注意的 =p.id 放在prior关键词的前面或者后面都没什么关系,也就是上面可以这样写 p.id= prior p.paren。重要的是prior旁边放的

                             是什么。


level伪列: 递归的层次表示, 用来进行输出缩进。可以看到递归层次,看起来很直观。 需要注意的是Level 也可以放在Group by后面,也可以放在select 后面.


下面我来讲一下递归语法的一些用法和一些需要注意的地方:

             有趣的是我们可以不使用start with 子句,它不像程序语言一样不写就会造成死循环(插一句嘴,曾经有一人和我聊天提到SQL不是编程语言,因为他不满足图灵完全。因为他并不能造成死循环,其实通过递归语句就可以,这个坑我会在后面演示,在本文中并不讨论SQL是不是编程语言)。它只会把会整个表的数据遍历一遍,每一个数据做一次

根节点,然后遍历树中的其他节点。

 

他等价于如下SQL:

 

select  p.ID,p.NAME,p.PARENT, level from u_permission p start with p.PARENT in( '祖宗节点','父节点','子节点','孙子节点' ) connect by p.id= prior p.parent;

2. start with 和connect by prior的位置可以互换:     

select  p.ID,p.NAME,p.PARENT, level from u_permission p start with p.PARENT=1 connect by p.id= prior p.parent;
select  p.ID,p.NAME,p.PARENT, level from u_permission p  connect by p.id= prior p.parent start with p.PARENT=1;
上面二条的SQL意思是一样的。


3.我们可以把start with看成是一个where,所以这也意味着我们可以在我们可以在除了最后部分以外的地方加where条件, 如:

select  p.ID,p.NAME,p.PARENT, level from u_permission p where p.id=xxx start with p.PARENT=1 connect by p.id= prior p.parent;
但是这里隐藏着一个坑, where条件的作用域不是在递归查询中的,而是在递归查询完后的。 所以如果理解不当他可以造成死循环(虽然会检测出来报ORA错误)也就是a的父节点是b, b的父节点是a。


看一个实用的列子:

    如果有一个需求如根据user表的id查出他的权限树,这个时候我们就需要start with后面加子查询。

     

        

    我们可以看到根据子查询返回的根节点查出所有子节点的父亲节点和祖宗节点。



下面是一些跟递归语法相关的函数(来自Oracle SQL高级编程):

      SYS_CINNECT_BY_PATH函数:

              这个函数是用来返回组成层级的直到当前行的值, 我一图胜千言把。

           


    简单来说就是用来做拼接的,至于想拼接什么看各位看官的心情咯。



CONNECT_BY_ISLEAF伪列:

         这个伪列呢,说直白一点跟level的作用差不多,只不过他是用来在递归查询中显示叶子节点而非递归深度。 留给看官实验,不上传实验图片了。


CONNECT_BY_ISCYCLE伪列 和NOCYCLE:

          这个函数用于检测树中是不是出现了环,传统的数据结构树是不会出现环的,只有在图中才会出现环。 而在数据库中我说过,他不是正儿八经

        的B树,他可能会出现一些不合人伦的事情,比如就像上面所说的死循环, a是b的父亲,b又叫a儿子这样尴尬的事情,Oracle会直接报出ORA-1436的

        错误,告诉你这样不太好。 所以我们可以用nocycle函数解决这个问题,也就是让b当儿子。使得SQL符合逻辑。

   

select  connect_by_isleaf ,p.ID,p.NAME,p.PARENT, CONNECT_BY_ISCYCLE , level from u_permission p  start with  p.PARENT=1 connect by nocycle p.id= prior p.parent;




connect_by_isleaf  函数:

       在递归中检测当前节点是否包含下级节点,也就是说是不是叶子节点,是返回0, 不是返回1,  在动态的目录中有用。       

select  connect_by_isleaf ,p.ID,p.NAME,p.PARENT, level from u_permission p  start with p.PARENT is null connect by p.id= prior p.parent;

关于Oracle递归和树形表就介绍到这里了,下次给大家分享用SQL实现有向图。

          

     

 







STM32F407中文手册 STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。 立即下载

相关推荐

大模型推理常见采样策略:Top-k, Top-p, Temperature, Beam Search

大模型推理采样策略,举例通俗易懂汇总介绍

qq_43243579的博客 2万+

oracle查询出树形结构的表,父节点数据是子节点的数据和

我们在查询数据时,经常会想查询出树形结构的数据,父节点数据是子节点的数据和,如下图: 通常会想到查出所有数据后台构造,但是这种方式运行效率低且复杂 如何直接oracle直接查询出数据传到前台? 1、建表 三要素:如我建的 fcode   主键           parent_id   父节点键值           fpath     路径 left join

Fupengyao的博客 5420

PIDNet实战:如何在Cityscapes数据集上实现93.2 FPS的实时语义分割(附完整训练代码)

本文提供了在Cityscapes数据集上实现实时语义分割模型PIDNet的完整工程实践指南。PIDNet凭借其独特的比例-积分-微分三分支架构,在CVPR 2023上取得了速度与精度的出色平衡。文章详细介绍了从环境配置、数据预处理、模型训练到性能优化与部署的全流程,并分享了实现93.2 FPS高推理速度的关键技巧与代码。

weixin_29047919的博客 377

Oracle中的树形查询及伪列

Oracle中的树形查询及伪列

m0_71406734的博客 5276

R语言机器学习:XGBoost线性回归模型的SHAP值

SHAP(SHapley Additive exPlanations)值是一种基于博弈论Shapley值的机器学习模型解释方法,能够解释任何模型的预测结果。其主要用途包括:1)提高模型的可解释性,帮助非技术用户理解模型预测;2)识别对模型预测最重要的特征,辅助特征选择;3)调试模型,发现预测中的异常;4)评估模型公平性,避免偏见。SHAP值的计算方法包括初始化、迭代计算、归一化和解释,常用工具如Python的shap库支持多种计算方式(如TreeSHAP、KernelSHAP等)。本文还提供了基于R语言计算

专注生信领域 3443

【学习系列】SAP RAP 1:关于RAP的一些基本介绍

摘要:SAP RAP和CAP是两种不同的开发模型。RAP(RESTful ABAP)用于在S/4HANA等ABAP平台上构建现代业务应用,基于CDS+OData,适合ABAP开发者扩展核心业务。CAP(云应用编程模型)是BTP上的云原生框架,支持Node.js/Java,适合构建跨系统集成应用。RAP优势在于与S/4HANA深度集成,CAP则更灵活,支持多云环境。选择依据主要取决于开发平台(S/4HANA或BTP)、技术栈(ABAP或Node.js/Java)及应用场景(核心扩展或云原生开发)。

DeveloperMrMeng的博客 1168

Oracle递归查询树形数据

start with connect by prior递归查询 1、start with 子句:遍历起始条件。 2、connect by prior 子句:连接条件。 3、order by 子句:排序。

weixin_40017062的博客 5544

【BUG已解决】RuntimeError: CUDA error: no kernel image is available for execution on the device 解决方案

方案适用场景推荐指数精确匹配官方版本绝大多数场景(大众消费卡+主流数据中心卡)⭐⭐⭐⭐⭐安装历史旧版本Pascal/Maxwell等老显卡⭐⭐⭐⭐安装Nightly版本刚发布的最新架构显卡⭐⭐⭐⭐源码编译官方各版本均不支持的特殊硬件⭐⭐Docker官方镜像追求省心、避免版本排查⭐⭐⭐⭐⭐的核心是PyTorch 预编译包不包含你显卡对应的计算能力架构先确认显卡真实计算能力),而不是盲目重装驱动对比 PyTorch 支持的架构列表),定位是否真的不匹配精确匹配官方版本。

博客 1万+

ORACLE (递归求和)有木有网友,可以帮我找个高效方案。

数据库

mdaefsc的博客 543

23 RAG 为什么答不准:召回、分块、排序的常见坑

RAG 答不准时,不要先怪模型。本文把常见失败拆成召回不到、召回不准、分块不完整、排序靠后、上下文污染和生成不忠实六类,并给出从 Top-K 检查到评估集的排查流程。

老于的笔记的专栏 248

Python OpenCV教程从入门到精通的全面指南【文末送书】

全书共分为16章,包括Python与OpenCV、搭建开发环境、图像处理的基本操作、像素的操作、色彩空间与通道、绘制图形和文字、图像的几何变换、图像的阈值处理、图像的运算、模板匹配、滤波器、腐蚀与膨胀、图形检测、视频处理、人脸检测和人脸识别以及MR智能视频打卡系统。主流技术,全面覆盖:本书内容丰富,涵盖了Open CV图像处理技术的方方面面,如图像的几何变换、阈值处理、图像运算、模板匹配、滤波器、腐蚀与膨胀、图形检测、视频处理、人脸检测和人脸识别等。此外,通过对比原图,可更直观地看到图像经过处理后的效果。

一键难忘的博客 9075

oracle使用connect by prior对树形表结构进行递归查询

oracle使用connect by prior对树形表结构进行递归查询onnect by prior start with 经常会被用到一个表中存在递归关系的时候。例如,我们经常会将一个目录树存储到一个表中。表结构及数据如下:ALI_CATEGORY(ID, CATEGORY_NAME, PARENT_ID, IS_LEAF)1、  根据一个子节点的id(例如id=6),获取从该子节点到该子节点对应的根节点这一路径上的所有节点记录(包括该子节点):select * from ali_category  a

caihaijiang的专栏 2753

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【oracle】oracle递归查询树形表所有节点和每个子节点的根节点语法糖

一个sql实现oracle递归查询树形表所有节点和每个子节点的根节点,实际工作中遇到类似情况可以直接使用

weixin_43219644的博客 1723

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

转 oracle 递归查询父子关系记录

select lpad(' ',4*(level-1))||t.project_id project_id,t.parent_project_id from PC_PROJECT_ASSOC t start with project_id='xRFv29ZYbE'connect by prior project_id = parent_project_id strat with ...

weixin_30732487的博客 213

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

oracle 中的递归查询

一、树型表结构:   节点ID  上级ID  节点名称 二、公式:   select 节点ID,节点名称,level        from   表        connect by prior 节点ID=上级节点ID        start with 上级节点ID=节点值       说明:         1、常见的树形结构为公司组织机构、地区……

changyanmanman的专栏 2588

oracle树型查询

[color=blue]如果我的博文能帮到你,我感到非常荣幸。能力所限,对于我所写的内容如有不详不对,你们能给一些意见的话我将非常感谢。以后我会将我在工作中学到的一些知识,尽量整理出来给大家分享。 你们的意见是我的动力[/color] [code="sql"]--树形表结构 create table TB_DEPT ( d_id NUMBER not null,...

近一大师 167

使用Oracle数据库实现树形结构表的子-父级递归查询和删除,通过级联菜单简单举例...

前言: 我们在开发中,常常遇到单表的子-父id级联的表结构,在树形的深度不确定的情况下,一次查询出某个树形结构下的所有具有子-父级关系的数据变得十分困难。 这时,我们使用oracle提供的CONNECT BY PRIOR ... start WITH 实现树形结构具有子父级关系的表递归查询和删除就会很方便。 1、树形结构表举例 (1)假设有一个MENU表,该表结构如下: ...

weixin_30845171的博客 439

oracle 查询当前节点对应的根节点的id

在 Oracle 数据库中,如果你有一个层次结构的数据(例如,树形结构),你可以使用递归查询(也称为层次查询)来找到某个节点对应的根节点。Oracle 提供了一个名为。以下是一个示例查询,它查找给定节点。表示节点的唯一标识符,另一个列。表示父节点的标识符。此外,如果你只需要找到根节点的。的子句来处理这种递归查询。

weixin_41203765的博客 510

Oracle 树操作、递归查询

http://www.cnblogs.com/yingsong/p/5035907.html一、Oracle中start with…connect by prior子句用法connect by 是结构化查询中用到的,其基本语法是:select … from tablename start with 条件1 connect by 条件2 where 条件3;简单说来是将一个树状结构存储在一张表里,比如

Amant 585

oracle树形表常用查询

一,表结构如下: create table area( id   NUMBER(19) NOT NULL, parent_id   NUMBER(19) NOT NULL, name        VARCHAR2(40) ); 二,数据如下: id parent_id name 1          0            中国 2

胡子哥 864

Oracle 递归

以前写菜单树。我是通过多次查询进行得到结果的,大概思路为先查询根节点。

qq_33422712的博客 2209

使用Oracle数据库实现树形结构表的子-父级迭代(递归)查询和删除,通过级联菜单简单举例

前言: 我们在开发中,常常遇到单表的子-父id级联的表结构,在树形的深度不确定的情况下,一次查询出某个树形结构下的所有具有子-父级关系的数据变得十分困难。 这时,我们使用oracle提供的CONNECT BY PRIOR ... start WITH 实现树形结构具有子父级关系的表递归查询和删除就会很方便。 1、树形结构表举例 (1)假设有一个MENU表,该表结构如下: ID

eguid音视频方向博客,分享经过实践检验的硬核音视频技术。FFmpeg、openCV和JavaCV音视频和图像处理系列教程发布十周年,众多开发者的严格验证。欢迎关注,一起交流探索学习最新音视频和图像处理技术 5253

树(tree)结构表递归查询的实现方法总结

表recursion数据如下: id       name      parentid 1      食品分类    -1 2      肉类             1 3      蔬菜类         1 4      产品分类    -1 5      保健品         4 6      医药             4 7      建筑

和静清寂 2972

oracle树结构统计,ORACLE 递归树型结构统计汇总

区域平台统计报表,省--市--区 汇总,还有各级医院,汇总与列表要在一个列表显示。用到ORACLE 会话时临时表GLOBAL TEMPORARY TABLE ON COMMIT PRESERVE ROWS;递归树:START WITH P.PARENTORG = ‘ROOT‘CONNECT BY PRIOR P.ORGCODE = P.PARENTORG;WITH 连续嵌套记录一下便...

weixin_33923901的博客 301

oracle中树形数据,Oracle常用数据库的树形查询-Oracle

Oracle常用数据库的树形查询表recursion数据如下:id name parentid1 食品分类 -12 肉类 13 蔬菜类 14 产品分类 -15 保健品 46 医药 47 建筑 4...

weixin_33260887的博客 327

树形结构数据库表查询封装为树形实体类

树形表结构如下 parent_id指向父级分类主键, 整体结构类似磁盘文件夹形式 业务处理 service接口, 继承mabatis-plus生成IService包含基本的curd方法 public interface ParentFlService extends IService<TblParentFl> { List<TblParentFlVO> get...

ssk1073543992的博客 1447
上一篇: 使用jdk1.8去除逻辑上重复的HashMap的value以及构建本地缓
下一篇: 用List构建带有层次结构的json数据
zh_coder
博客等级 码龄12年 31粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值