首页 > 数据库 >Oracle中start with connect by prior 使用方法

Oracle中start with connect by prior 使用方法

时间:2023-09-23 14:33:58浏览次数:30  
标签:code start prior connect org 节点

一、语法

{ CONNECT BY [ NOCYCLE ] condition [AND condition]... [ START WITH condition ]
| START WITH condition CONNECT BY [ NOCYCLE ] condition [AND condition]...} 
解释: 
start with: 指定起始节点的条件 
connect by: 指定父子行的条件关系 
prior: 查询父行的限定符,格式: prior column1 = column2 or column1 = prior column2 and ... , 
nocycle: 若数据表中存在循环行,那么不添加此关键字会报错,添加关键字后,便不会报错,但循环的两行只会显示其中的第一条 循环行: 该行只有一个子行,而且子行又是该行的祖先行 
connect_by_iscycle: 前置条件:在使用了nocycle之后才能使用此关键字,用于表示是否是循环行,0表示否,1 表示是 
connect_by_isleaf: 是否是叶子节点,0表示否,1 表示是 
level: level伪列,表示层级,值越小层级越高,level=1为层级最高节点 

二、使用

oracle的start with connect by prior是根据条件递归查询"树",分为四种使用情况:

第一种:查询结果自己所有的后代节点(包括自己)

start with 子节点ID='...' connect by prior 子节点ID = 父节点ID 
select * from mdm_organization o start with o.org_code='10000008' connect by prior o.org_code=o.org_parent_code

按照条件org_code='10000008',对'10000008'(包括自己)及其子节点进行递归查询,结果如下:

 第二种:查询结果自己所有的前代节点(包括自己)

start with 子节点ID='...' connect by 子节点ID = prior 父节点ID 
select * from mdm_organization o start with o.org_code='10000008' connect by o.org_code=prior o.org_parent_code

按照条件org_code='10000008',对'10000008'(包括自己)及其父节点进行递归查询,结果如下:

 第三种:查询结果自己所有的后代节点(不包括自己)

start with 父节点ID='...' connect by prior 子节点ID = 父节点ID 
select * from mdm_organization o start with o.org_parent_code='10000008' connect by prior o.org_code=o.org_parent_code

按照条件org_parent_code='10000008',对'10000008'(不包括自己)子节点进行递归查询,结果如下:

 第四种:查询结果自己的第一代后节点和所有的前代节点(包括自己)

start with 父节点ID='...' connect by 子节点ID = prior 父节点ID 
select * from mdm_organization o start with o.org_parent_code='10000008' connect by o.org_code = prior o.org_parent_cod

按照条件org_parent_code='10000008',对'10000008'(包括自己)的第一代孩子们及其父节点进行递归查询,结果如下:

 如果有where 条件,如下:

select * from mdm_organization o where 条件 start with o.org_parent_code='10000008' connect by o.org_code = prior o.org_parent_code

执行顺序为先执行start with connect by prior,然后再按照where条件进行过滤。

该部分参考(oracle的start with connect by prior如何使用),具体请前往查看。

三、函数

1、sys_connect_by_path函数

语法:sys_connect_by_path(列名, '分隔符')。
作用:从start with的地方开始遍历,将遍历到的路径根据函数中的分隔符,组成一个新的字符串。

select sys_connect_by_path(ename, '/') ename_tree from scott.emp
start with ename = 'KING'
connect by mgr = prior empno;

sys_connect_by_path函数使用的一个小技巧,把查询行转换成列,把表emp的所有列名以'|'分隔开输出(提示:大家可以把下面的语句拆开来逐个分析),SQL语句如下:

select max(ltrim(sys_connect_by_path(column_name, '|'), '|')) column_names from (select column_name, rownum rnum
from user_tab_columns
where table_name = 'EMP')
start with rnum = 1
connect by rnum = rownum;

2、level函数

在结构化查询结果中,每一行都是结构中的一个节点,level表示该节点在结构中的层次,根节点为1,根节点的子节点为2,以此类推。
下面SQL语句很直观的展示效果:

select ename, sys_connect_by_path(ename, '/') ename_tree, level
from scott.emp
start with ename = 'KING'
connect by mgr = prior empno;

3、connect_by_root函数

用在列名之前,返回当前节点的根节点对应列的值。

下面SQL语句很直观的展示效果:

select connect_by_root ename as root
from scott.emp e
start with e.ename = 'KING'
connect by prior e.empno = e.mgr;

4、connect_by_isleaf函数

返回当前节点是否为叶子节点,“是”返回1,“否”返回0。

下面SQL语句很直观的展示效果:

select connect_by_isleaf as isleaf
from scott.emp e
start with e.ename = 'KING'
connect by prior e.empno = e.mgr;

 

标签:code,start,prior,connect,org,节点
From: https://www.cnblogs.com/lgx5/p/17724344.html

相关文章

  • Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connect
    报错 Maxretriesexceededwithurl:/(CausedbyNewConnectionError('<urllib3.connection.HTTPSConnectionobjectat0x000001A73833FD00>:Failedtoestablishanewconnection:[WinError10060]  pipuninstallrequestsurllib3  #先卸载pipinstallre......
  • Cannot initiate the connection to cn.archive.ubuntu.com:80 (2403:2c80:5::6). - c
     版本:ubuntu22.04 Cannotinitiatetheconnectiontocn.archive.ubuntu.com:80(2403:2c80:5::6).-connect(101:Networkisunreachable) 嗯,被墙了。找到/etc/apt/source.list替换里面的源为清华源 ubuntu|镜像站使用帮助|清华大学开源软件镜像站|Tsinghu......
  • 必看!S3File Sink Connector 使用文档
    S3File是一个用于管理AmazonS3(SimpleStorageService)的Python模块。当前,ApacheSeaTunnel已经支持S3FileSinkConnector,为了更好地使用这个Connector,有必要看一下这篇使用文档指南。描述将数据输出到AWSS3文件系统。提示:如果您使用的是Spark/Flink,在使用此连接......
  • 小白也能看懂的插件化DroidPlugin原理(三)-- 如何拦截startActivity方法
    **前言:**在前两篇文章中分别介绍了动态代理、反射机制和Hook机制,如果对这些还不太了解的童鞋建议先去参考一下前两篇文章。经过了前面两篇文章的铺垫,终于可以玩点真刀实弹的了,本篇将会通过Hook掉startActivity方法的一个小例子来介绍如何找出合适的Hook切入点。开始之前我们......
  • 成功入选 2023 谷歌出海创业加速器,Tapdata 乘势远航Tapdata Connector 实用指南:如何将
    9月6日,2023Google开发者大会的收官之行于上海拉开帷幕。会间,官方正式公布了最新一期谷歌出海创业加速器入营名单,Tapdata成功入选:长期以来,Google开发者大会为开发者提供了一个独一无二的学习和合作机会,这是一场汇聚全球创新者的聚会,鼓励创新思维。从中能够深入了解最新的......
  • bash: ./startup.sh: Permission denied
    启动时候发现权限不足解决办法:chmodu+x*.sh 为所有.sh脚本添加执行权限chmod u+x*.sh,表示对当前目录下的file.sh文件的所有者增加可执行权限。u代表所有者;x代表执行权限;......
  • MySQL压缩包安装问题记录Can't connect to MySQL server on localhost (10061)解决方
    本文章向大家介绍MySQL问题记录--Can'tconnecttoMySQLserveronlocalhost(10061)解决方法,主要包括MySQL问题记录--Can'tconnecttoMySQLserveronlocalhost(10061)解决方法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下......
  • A TCP connection test tool
    Hi,ThisisaTCPconnectiontool. Youcanuseittoestablishmultipleconnectionswithserverandtestserverperformance. Download:source |exe ......
  • Docker ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/contai
     错误排查:都会用 2那里 搜索 ,答案又是满天飞,且抄手一大帮! 正确实的方式:  tail-200f/var/log/messages    查看日志,具体定位! ......
  • ELK日志采集 - QuickStart
    目录架构选型ELKEFLKElasticsearchES集群搭建常用命令Filebeat功能介绍安装步骤Filebeat配置详解filebeat常用命令Logstash功能介绍安装步骤Input插件Filter插件GrokFilter插件MutateFilter插件常见的插件配置选项:MutateFilter配置案例:Output插件Kibana功能介绍安装步骤架构......