Q4:Oracle通过递归查询父子兄弟节点方法示例

前言

说到Oracle中的递归查询语法,我觉得有一些数据库基础的童鞋应该都知道,做项目的时候应该也会用到,下面本文就来介绍下关于Oracle通过递归查询父子兄弟节点的,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

方法如下:

1、查询某节点下所有后代节点(包括各级父节点)// 查询id为101的所有后代节点,包含101在内的各级父节点select t.* from SYS_ORG t start with id = 101 connect by parent_id = prior id

2、查询某节点下所有后代节点(不包含各级父节点)select t.*from SYS_ORG twhere not exists (select 1 from SYS_ORG s where s.parent_id = t.id)start with id = 101connect by parent_id = prior id

3、查询某节点所有父节点(所有祖宗节点)select t.*from SYS_ORG tstart with id = 401000501connect by prior parent_id = id

4、查询某节点所有的兄弟节点(亲兄弟)select * from SYS_ORG twhere exists (select * from SYS_ORG s where t.parent_id=s.parent_id and s.id=401000501)

5、查询某节点所有同级节点(族节点),假设不设置级别字段with tmp as(select t.*, level leaffrom SYS_ORG tstart with t.parent_id = 0connect by t.parent_id = prior t.id)select *from tmpwhere leaf = (select leaf from tmp where id = 401000501);

这里使用两个技巧,一个是使用了level来标识每个节点在表中的级别,还有就是使用with语法模拟出了一张带有级别的临时表

6、查询某节点的父节点及兄弟节点(叔伯节点)with tmp as(select t.*, level levfrom SYS_ORG tstart with t.parent_id = 0connect by t.parent_id = prior t.id)select b.*from tmp b,(select *from tmpwhere id = 401000501 and lev = 2) awhere b.lev = 1union allselect *from tmpwhere parent_id = (select distinct x.idfrom tmp x, --祖父tmp y, --父亲(select *from tmpwhere id = 401000501 and lev > 2) z --儿子where y.id = z.parent_id and x.id = y.parent_id);

这里查询分成以下几步。

首先,将全表都使用临时表加上级别;

其次,根据级别来判断有几种类型,以上文中举的例子来说,有三种情况:

(1)当前节点为顶级节点,即查询出来的lev值为1,那么它没有上级节点,不予考虑。

(2)当前节点为2级节点,查询出来的lev值为2,那么就只要保证lev级别为1的就是其上级节点的兄弟节点。

(3)其它情况就是3以及以上级别,那么就要选查询出来其上级的上级节点(祖父),再来判断祖父的下级节点都是属于该节点的上级节点的兄弟节点。

最后,就是使用union将查询出来的结果进行结合起来,形成结果集。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。您可能感兴趣的文章:深入sql oracle递归查询oracle SQL递归的使用详解oracle 使用递归的性能提示测试对比

oracle获取所有子节点,oracle递归查询所有子节点相关推荐

  1. oracle 获取系统年 月,Oracle 获取当前年、月、日

    Oracle 获取当前年.月.日 第一种:new Timestamp(System.currentTimeMillis()): 第二种:sysdate; 1.//oracle中extract()函数从 ...

  2. oracle获取序列跳号,Oracle sequence跳号知多少

    Sequence是oracle中的一个非常常用的功能,开发经常会频繁使用.但是在生产环境中经常有应用反馈通过sequence生成的自增主键会出现不连续跳号的现象,而且是几十个几十个地跳,为了弄清楚se ...

  3. oracle获取序列并赋值,Oracle中序列的使用

    数据库设计的三大范式第一条就是独立的表结构中必须有唯一主键来标识表中数据.在以往微软的SQL Server(duo版本)平台上.手动编码实现表中主键.并设定为自增列是极其简单.编码如下: typeid ...

  4. oracle获取减一年,oracle日期减一年 oracle指定日期减一天

    oracle怎么将当前时间减一年? 1. 打开PLSQL,连接Oracle数据库,用SQL语句创建测试表.这里只做了演示,所以不创建主键和索引.; 2. 使用SQL语句将3行测试数据插入到上一步创建的 ...

  5. oracle 获取汉字简拼,oracle自定义函数(全拼跟简拼)

    oracle自定义函数(全拼和简拼) 1.全拼 CREATE OR REPLACE FUNCTION TOASPELL (Name in varchar2) return Varchar2 DETER ...

  6. oracle获取上年年初,【Oracle】TRUNC:获取去年年初和年末,获取月初和月末;

    一.需求 当前时间:2018-1-6 16:56:01 因为要在数据库里获取去年年初,即(2017-1-1 00:00:00)和去年年末(2017-12-31 23:59:00)这两个时间段内的数据: ...

  7. oracle获取下级函数,从oracle获取函数和过程签名列表

    这是一个生成PL / sql函数原型的小脚本: DECLARE -- Local variables here strPrev_object VARCHAR2(30); strReturn_type ...

  8. mysql 递归查找父节点_MYSQL递归查询所有父节点

    1.表结构:CREATE TABLE `t_busi_system` ( `ID` varchar(64) NOT NULL COMMENT '标识', `PARENT_ID` varchar(64) ...

  9. 根据子节点递归查询所有父节点

    有个需求,需要根据给定的子节点向上递归查询所有父节点,网上查找了一些,但是都不是很满意,有的是需要用到全局变量定义存储列表,但是会有并发问题,然后自己手写一个 @Testvoid contextLoa ...

最新文章

  1. select count(*) from temp 与select count(1) from temp有什么区别
  2. d.php xfso_PHP扩展调用so动态链接库
  3. 带Left Join的SQL语句的执行顺序
  4. php变量名当文件命_php基础教程 第二步 通俗易懂的学习变量、常量与数据类型...
  5. Storm Trident API
  6. luogu_P3313 [SDOI2014]旅行
  7. 你会利用css写下拉列表框吗?
  8. IOS8如何获取当前UIViewController
  9. python的最受欢迎的库_2018年最受欢迎的15个Python库
  10. UVALive 4223 Trucking 二分+spfa
  11. 抽象类和接口的主要区别
  12. Win10 查看 DLL 中的函数
  13. CentOS7.0设置中文输入法
  14. 《穿越计算机的迷雾》读书笔记九
  15. 商业模式画布 - 天涯的日志 - 网易博客
  16. 自底向上的归并排序算法
  17. 编译原理实验二 语法分析程序设计与实现
  18. 关于win10访问u盘被拒绝,显示没有权限访问问题的解决方案
  19. 计算机课制作海报教案,信息技术作品制作教案
  20. python 执行linux rm命令_Linux rm命令:删除文件

热门文章

  1. 自定义函数5,is_leap_year判断是否为闰年
  2. linux桌面天气,安装和使用Meteo以在Linux系统上获得快速天气预报
  3. (二)MATLAB数学建模——规划问题
  4. 关于安装oracle[INS-30131]错误解决方法
  5. 六西格玛管理四个核心理念
  6. 计算机网络——(9)网络管理与网络安全
  7. ubuntu18.04LTS每次重启后蓝牙鼠标都要重新连接解决办法
  8. Windows 黑科技工具推荐
  9. 要自律,自律,自律的小日记1
  10. PPT快捷键超全合集,你也可以成为PPT实操王者