start_with connect_by_prior

Oracle递归查询-start with connect by prior 用法 创建测试数据: CREATE TABLE TEST_DEPT(ID varchar2(10) NOT NULL,NAME varchar2(200),PID varchar2(10)); INSERT INTO TEST_DEPT(ID, NAME, PID) VALUES ('1000', '总公司', NULL); INSERT INTO TEST_DEPT(ID, NAME, PID) VALUES ('1001', '北京分公司', '1000'); INSERT INTO TEST_DEPT 阅读详情

    

这几个关键是查询递归数据的,形成一个树状结构。目前只有

oracle

支持,其他数据都要结合存储过程实现

 

语法:

 

select * from some_table [where 

条件

1] connect by [

条件

2] start with [

条件

3];

 

   

其中

 

connect by 

与

 

start with 

语句摆放的先后顺序不影响查询的结果,

[where 

条件

1]

可以不需要。

 

[where 

条件

1]

、

[

条件

2]

、

[

条件

3]

各自作用的范围都不相同:

 

     

 

[where 

条件

1]

是在根据

“connect by [

条件

2] start with [

条件

3]”

选择出来的记录中进行过滤,是针对单条记录的过滤,

 

不会考虑树的结构;

 

    

 

[

条件

2]

指定构造树的条件,以及对树分支的过滤条件,在这里执行的过滤会把符合条件的记录及其下的所有子节点都

过滤掉;

 

   

 

[

条件

3]

限定作为搜索起始点的条件,如果是自上而下的搜索则是限定作为根节点的条件,如果是自下而上的搜索则是

限定作为叶子节点的条件;

 

      

这几个关键是查询递归数据的,形成一个树状结构。目前只有oracle支持,其他数据都要结合存储过程实现

语法: select * from some_table[where 条件1]connect by [条件2]start with [条件3];

   其中connect by 与 start with 语句摆放的先后顺序不影响查询的结果,[where 条件1]可以不需要。[where 条件1]、[条件2]、[条件3]各自作用的范围都不相同:

     [where 条件1]是在根据“connectby [条件2] start with [条件3]”选择出来的记录中进行过滤,是针对单条记录的过滤, 不会考虑树的结构;

     [条件2]指定构造树的条件,以及对树分支的过滤条件,在这里执行的过滤会把符合条件的记录及其下的所有子节点都过滤掉;

    [条件3]限定作为搜索起始点的条件,如果是自上而下的搜索则是限定作为根节点的条件,如果是自下而上的搜索则是限定作为叶子节点的条件;

   

对prior的说明:prior存在于[条件2]中,可以不要,不要的时候只能查找到符合“start with [条件3]”的记录,不会在寻找这些记录的子节点。要的时候有两种写法:connect by prior empno=mgr 或connect by empno=prior mgr,前一种写法表示采用自上而下的搜索方式(先找父节点然后找子节点),后一种写法表示采用自下而上的搜索方式(先找叶子节点然后找父节点)


   [执行原理] 遍历表中的每条记录,对比是否满足start with后的条件,如果不满足则继续下一条, 如果满足则以该记录为根节点,然后递归寻找该节点下的子节点, 查找条件是connect by后面指定的条件,比如下面的例子,是当前记录的id等于其子节点的parentid,如此循环直到遍历完整个表的所有记录 如果数据有问题,出现循环,即a是b的经理,b是c的经理,c又是a的经理,查询会出现ORA-01436: 用户数据中的 CONNECT BY 循环 的错误,可在connectby后面添加nocycle 解决这个问题。

    结合sys_connect_by_path 函数,可以做出更好的效果



create table dept(id number(9) primary key,name varchar2(100),parentid number(9));

     insert into dept values(01,'管理部','');
     insert into dept values(02,'开发部','');
     insert into dept values(03,'测试部','');
     insert into dept values(04,'销售部','');
     insert into dept values(0201,'开发1部',02);
     insert into dept values(0202,'开发2部',02);
     insert into dept values(0203,'开发3部',02);
     insert into dept values(0301,'测试1部',03);
     insert into dept values(0302,'测试2部',03);
     insert into dept values(0401,'销售1部',04);
     insert into dept values(0402,'销售2部',04);
     insert into dept values(0403,'销售3部',04);
     insert into dept values(0404,'销售4部',04);
     insert into dept values(020101,'开发1部1组',0201);

     insert into dept values(020102,'开发1部2组',0201);


     查询语句(由根到叶):

     select * from dept a start with id=2 connect by prior a.id=a.parentid

    测试结果:

 IDNAMEPARENTID
12开发部
2201开发1部2
320101开发1部1组201
420102开发1部2组201
5202开发2部2
6203开发3部2


     查询语句(说明where是对选择出来的结果再过滤):

     select * from dept a where a.name like '%组%' start with id=2 connect by prior a.id=a.parentid

    测试结果:

 IDNAMEPARENTID
120101开发1部1组201
220102开发1部2组201


      查询语句:

     select * from dept a  start with id=2 connect by  a.id=a.parentid

     测试结果:

 IDNAMEPARENTID
12开发部

    查询语句(叶到根):

     select * from dept a start with id=20101 connect by a.id=  prior a.parentid

    测试结果:

 IDNAMEPARENTID
120101开发1部1组201
2201开发1部2
32开发部

      查询语句(结合sys_connect_by_path ):

     select id,name,sys_connect_by_path(name,'/') from dept start with name='开发部' CONNECT BY prior id=parentid;

      测试结果:

 IDNAMESYS_CONNECT_BY_PATH(NAME,'/')
12开发部/开发部
2201开发1部/开发部/开发1部
320101开发1部1组/开发部/开发1部/开发1部1组
420102开发1部2组/开发部/开发1部/开发1部2组
5202开发2部/开发部/开发2部
6203开发3部/开发部/开发3部



 


    

SAP Workflow 工作流开发步骤总结 SAP WORKFLOW 阅读详情

相关推荐

自动配胶机的PLC控制系统设计

我们根据自动配胶机的控制需求,编写了相应的PLC程序。PID温度控制算法的实现方面,我们采用了经典的PID控制算法,通过不断调整加热器的功率,实现对胶水混合温度的精确控制。在PLC程序中,我们编写了PID控制算法的程序模块,通过实时采集温度传感器的数据,计算温度偏差和偏差变化率,并根据PID控制算法计算出加热器的功率输出值,实现对温度的精确控制。在系统调试阶段,我们对自动配胶机的各个部分进行了详细的测试和调试,包括气路和液路的开关测试、传感器的精度测试、步进电机的位置和速度测试以及PLC程序的逻辑测试等。

lagougongzuoshi的博客 1227

Oracle系列:start with connect by prior 使用方法

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 按照条

哇哇哇,真的学到了!!! 1万+

VFIO框架源码分析(一)- 从初始化到设备访问

本文深入剖析了Linux内核中的VFIO(Virtual Function I/O)框架,详细解读了其从初始化到设备访问的全过程。VFIO通过Container->Group->Device的层次化设计,利用IOMMU提供安全隔离,允许用户空间直接访问物理设备。文章基于Linux v5.15版本,重点分析了vfio_init模块入口、Container创建与配置、Group关联以及最终设备访问等关键环节,揭示了VFIO如何通过逐层授权机制构建安全可靠的设备直通模型,为虚拟化技术提供核心支持。

qq_36071928的博客 380

Oracle SYS_CONNECT_BY_PATH+START WITH..CONNECT BY PRIOR 转换到mysql中的使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 最近公司有个需求就是明年Oracle到期,并且不准备续费了,准备切换到mysql数据库,数据迁移已经在测试环境完成,但是程序代码要修改的地方还很多。发现Oracle有个函数,mysql是没有的,只能自定义函数来实现了。在此记录一下,以免遗忘。 提示:以下是本篇文章正文内容,下面案例可供参考 一、oracle 中

qq_36230361的博客 3285

【nnUNetv2进阶】四、nnUNetv2 魔改网络-小试牛刀-加入注意力机制ChannelAttention

本文介绍了在nnunet中加入ChannelAttention的方法,按照本文教的教程,可以快速完成ChannelAttention的加入和自定义模型的跑通。

AI爱好者的博客,分享计算机领域相关知识 5802

做了一个3DTiles编辑器,支持3DTiles的预览和裁剪导出

3DTiles编辑器的功能极其简洁,核心就是3DTiles格式模型的预览和裁剪。为了演示方便,本文所使用的源数据为mipmap3d[1]网站所提供的无人机拍摄影像,并进行3DTiles构建。打开软件,输入的绝对路径之后,点击添加模型,就可以将模型加载进预览区。之后,点击裁剪模式按钮,默认会出现立方体裁剪框,可通过拖动句柄的方式去调整裁剪框的范围。同时,除了默认的盒体裁切模式外,还支持多边形裁切,点击多边形裁切后,可切换到顶视图,选择重绘多边形,可进行打点绘制。

兴趣使然的创作者 602

oracle层级关系按列存储_oracle树形结构层级查询之start with ....connect by prior、level、order by以及sys_connect_by_path之浅谈...

浅谈oracle树状结构层级查询oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只要精通数据库那么对于java开发你就成功了三分之一,本篇中主要介绍start with...connect by prior 、order by 、sys_connect_by_path。概要:树状结构...

weixin_42126399的博客 547

EDKII环境配置完整版

参考博客【EDK2 UDK2018的环境搭建】:https://blog.youkuaiyun.com/qq_39155263/article/details/82965744下载EDK2 1.直接从https://github.com/tianocore/edk2/ 网站下载.zip压缩文件 2.运用svn 从http://svn.code.sf.net/p/edk2/code/trunk/edk2edk2下载 3.安装Visual Studio2017 安装其他Tool 1.IASL 从https..

tianpu2320959696的博客 1855

ORACLE - 递归查询 - START WITH \ CONNECT BY PRIOR 、SYS_CONNECT_BY_PATH

ORACLE - START WITH \ CONNECT BY PRIOR 、SYS_CONNECT_BY_PATH

baojiangfeng的博客 495

QPrintPreviewDialog 打印预览使用实例

qt打印机预览实用demo

啊渊的专栏 3677

CLCD 中国生命周期基础数据库使用攻略

CLCD 是公共建筑碳排放计算的理想选择,其本地化数据可显著提高计算准确性。

hy行者勇哥的博客 2689

Oracle递归查询树形数据

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

weixin_40017062的博客 5544

Android 12.0 kenel中修改rom系统内部存储的大小

在12.0的系统rom产品开发定制中,在对一些产品开发中的配置需求方面,由于在产品后续订单中,有些产品是出口的,但是硬件方面已经定板,时间比较仓促,所以 就需要软件方面在rom内部存储的大小方面作假,修改rom真实的大小容量,所以就需要在kenel驱动部分来修改这部分的值最好了,接下来分析下计算rom容量的 相关代码,然后做出相关的修改,来实现功能

安卓兼职framework和app工程师的博客 1678

start with connect by prior的使用方法

转载文章地址: https://www.cnblogs.com/benbenduo/p/4588612.html 测试数据 创建表 create table TEST_TABLE ( parentid VARCHAR2(10), subid VARCHAR2(10) ); 插入测试数据 insert into test_table (PARENTID, SUBID) values ...

咖啡杯里的茶 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

oracle start with connect by prior用法

oracle start with connect by prior用法 作用:显示树形表结构的信息 测试脚本: create table a_test ( parentid varchar2(10), subid varchar2(10) ); insert into a_test values ( '1', '2' ); insert into a_test values ...

plumblum的博客 976

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Start with connect by prior 递归 树查询

oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是:   select * from tablename         start with cond1   connect by cond2   where cond3; 简单说来是将一个树状结构存储在一张表里,

yyqasg的专栏 1231

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Oracle中select from where start with connect by prior子句用法

Oracle中select from where start with connect by prior子句用法connect by 是’结构化查询’中用到的,其基本语法是:select ... from tablename where 条件3 start with 条件1 connect by 条件2;例:select * from table start with org_id = 'HBHqfWGWPy'--定义起始节点 connect by prior org_id = parent_id;简..

weixin_36346676的博客 1351

Oracle 迭代查询 CONNECT BY PRIOR ……START WITH ……

 connect by prior start with 经常会被用到一个表中存在递归关系的时候。比如我们经常会将一个比较复杂的目录树存储到一个表中。或者将一些部门存储到一个表中,而这些部门互相有隶属关系。这个时候你就会用到connect by prior start with。 表结构:create table TB_ORG(  ORGID            VARCHAR2(50)

Kenny1985的专栏 3410

Oracle 树操作、递归查询(select…start with…connect by…prior)

Oracle 树操作、递归查询(select…start with…connect by…prior) 一、Oracle中start with…connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是: select … from tablename where 条件1, 可选; connect by 条件2,是连接条件,其中用PRIOR表示上一条记录,...

9141

oracle的start with connect by prior如何使用

oracle的start with connect by prior如何使用 oracle的start with connect by prior是根据条件递归查询"树",分为四种使用情况:  第一种:start with 子节点ID='...' connect by prior 子节点ID = 父节点ID select*frommdm_organization o startwitho.org_code='10000008'connectbyprioro.org_code=o...

程序猿_hw的博客 364

ORACLE查询树型关系(start with connect by prior)

oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: select * from tablename start with cond1 connect by cond2 where cond3; 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段

amork的专栏 1万+

Oracle start with connect by prior 使用总结

Oracle树形数据结构查询数据

奥利奥小兵的博客 1万+

connect by prior... start with的使用

<br /><br />假设我们现在有如下结构的数据(T_Topic) <br />TopicID ParentID TopicTitle <br /> <br />1           null          请教Oracle 选取树状数据<br />2            1            re:请教Oracle 选取树状数据<br />3            1            其实只要这样就可以<br />4            1            我也有同样的问题

xiaoman111的专栏 390

层次查询START WITH... CONNECT BY PRIOR、LEVEL伪列

一、层次查询 START WITH... CONNECT BY PRIOR START WITH 指定层次的根行(开始的地方)。 这个子句对于一个正确的分级查询是必须的。 CONNECT BY PRIOR 指定列, 其中存在父与子行的关系。对于分级查询该子句是必须的。PRIOR指上一条记录的意思。   CONNECT BY PRIOR COLUMN1 = COLUMN2 遍历方向:

u013053796的专栏 1784

Oracle start with connect by prior 递归查询

条件1:相当于基本的筛选数据条件2:递归查询起始条件条件3:连接条件,其中用PRIOR;就是说上一条记录的id是本条记录的parent_id再进行查询(查子集);;就是说上一条记录的parent_id是本条记录的id再进行查询(查父集);

zk_tww的博客 706

start with connect by prior学习

这是oracle中的树查询,查询出来的数据会根据上下级组成树的结构。select * from mw_sys.mwt_pd_deps start with obj_id = '63EBEC8E-E766-40D7-ACF4-FEA945102112-00042'connect by prior obj_id = sjbm这个是从 obj_id这个节点的数据开始 查询他及下面的子数据,这...

aedx78029的博客 155
上一篇: JAVA中方法和变量在继承中的覆盖和隐藏
下一篇: itext document table
lujun12
博客等级 码龄15年 0粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值