转载文章地址: 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', '2');
insert into test_table (PARENTID, SUBID) values ('1', '3');
insert into test_table (PARENTID, SUBID) values ('2', '4');
insert into test_table (PARENTID, SUBID) values ('2', '5');
insert into test_table (PARENTID, SUBID) values ('3', '6');
insert into test_table (PARENTID, SUBID) values ('3', '7');
insert into test_table (PARENTID, SUBID) values ('5', '8');
insert into test_table (PARENTID, SUBID) values ('5', '9');
insert into test_table (PARENTID, SUBID) values ('7', '10');
insert into test_table (PARENTID, SUBID) values ('7', '11');
insert into test_table (PARENTID, SUBID) values ('10', '12');
insert into test_table (PARENTID, SUBID) values ('10', '13');

数据结构

使用场景

主要是用于B树等类型结构的递归查询,我们可以通过树中的任意一个节点来遍历该树。

语法格式

 select … from tablenamestart with 条件1connect by *** prior ***where 条件3;

语法说明

  • start with: 遍历的开始节点,可以是父节点也可以是子节点

    • 父节点

      SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.parentid = '3'
      CONNECT BY PARENTID = PRIOR SUBIDORDER BY LEVEL DESC
      

      结果:

      上面start with后面接的是父节点为3,遍历的结果就是以3位父节点的所有数据,如果父节点是最后的叶子节点(比如13),那么查询结果就是空。

    • 子节点

      SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.subid = '7'
      CONNECT BY PARENTID = PRIOR SUBIDORDER BY LEVEL DESC
      

      结果

      可以看到子节点subid是从7开始的。

  • connect by prior : 连接条件。关键词priorprior跟父节点列放在一起,就是往父结点方向遍历,prior跟子结点列放在一起,则往叶子结点方向遍历,父节点与子节点谁放在“=”前都无所谓,关键是prior跟谁在一起。

    • 可以看到在上面的案例中start with后面无论是接的subid还是parentid都是向树的下方(子节点)去遍历。这个就是与prior是与谁连接在一起有关了。上面的两个例子中与prior连接在一起的都是subid,因此都是向子节点去遍历。

    • priorparentid相连

      SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.subid = '7'
      CONNECT BY subid = PRIOR parentidORDER BY LEVEL DESC
      

      结果

      可以看到此时是向父节点去遍历的。因为prior后面是紧跟的parentid

使用level

在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2。需要注意的是这里所说的根节点指的是start with后面的那个节点

parentid为第一层级

SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.parentid = '7'
CONNECT BY parentid = PRIOR subidORDER BY LEVEL DESC;
SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.parentid = '7'
CONNECT BY subid = PRIOR parentidORDER BY LEVEL DESC;


可以看到无论prior后面接的是parentid还是subid,第一层级都是parentid为7(start with后面的值)。

subid为第一层级

SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.subid = '7'
CONNECT BY parentid = PRIOR subidORDER BY LEVEL DESC;
SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.subid = '7'
CONNECT BY subid = PRIOR parentidORDER BY LEVEL DESC;

此时可以看到无论prior后面接的是parentid还是subid,当start with后面接的是subid为7时,那么第一层级都是subid为7。

start with connect by prior的使用方法相关推荐

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

    一.语法 { CONNECT BY [ NOCYCLE ] condition [AND condition]... [ START WITH condition ] | START WITH con ...

  2. Oracle中start with xx connect by prior 语句解析

    Oracle中start with xx connect by prior 语句解析 ​ Oracle这种的start with语句主要对B型树的数据进行递归查询.可以指定数据树上的任一节点,然后查找 ...

  3. oracle 递归查询,Oracle递归查询(start with…connect by prior)

    查询基本结构: select - from table_name start with 条件1 connect by 条件2 1.建测试用表 1 create table test_prior( 2 ...

  4. Oracle 树操作(select…start with…connect by…prior)

    oracle树查询的最重要的就是select-start with-connect by-prior语法了.依托于该语法,我们可以将一个表形结构的以树的顺序列出来.在下面列述了oracle中树型查询的 ...

  5. 用select 语句中的START WITH...CONNECT BY PRIOR子句实现递归查询

    from http://www.javaeye.com/topic/184074 今天发现在oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归 ...

  6. SQL基础--层次化查询(START BY ... CONNECT BY PRIOR)

    为什么80%的码农都做不了架构师?>>>    --====================================================== --SQL基础--& ...

  7. Oracle中start with...connect by prior子句用法

    http://www.cnblogs.com/ZHF/archive/2008/09/10/1288101.html Oracle中start with...connect by prior子句用法 ...

  8. 在oracle中通过connect by prior来实现递归查询!

    connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start by cond1 connect by cond2 where cond3; ...

  9. oracle中用START WITH...CONNECT BY PRIOR子句实现递归查询

    今天发现在oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: select . ...

最新文章

  1. 高并发:RocketMQ 削峰实战
  2. 《深入浅出Ext JS(第2版)》获专家好评
  3. 手机上可以学python吗_Python爬虫也能用手机进行抓包?没错!这个技巧我只告诉你...
  4. DataGrip按某列大小对数据集进行排序
  5. 发了篇paper,双非二本的她直博浙大
  6. 信息学奥赛一本通 1397:简单算术表达式求值 | OpenJudge NOI 1.12 01:简单算术表达式求值
  7. 资源放送丨《Oracle RAC 集群安装部署》PPT视频
  8. 计算机快捷键m是什么,教程方法;m、ac快捷键电脑技巧-琪琪词资源网
  9. *N#1234567CG,解析征信报告里的暗语
  10. python跟java 效率_Python注重可读性和效率:与Java、PHP以及 C++语言对比谁受欢迎?...
  11. idea svn 的使用----转载,挺好的
  12. 万能的搜索--之DFS(二)
  13. QML 自定义鼠标光标
  14. ICS工业控制安全类方向赛题简单总结
  15. php渐变闪动字体代码,33种超好看彩色闪字渐变代码分享
  16. 网站特效圈小猫游戏代码
  17. 勒让德多项式的正交性和归一化
  18. 2G 3G和4G物联网卡之间的区别
  19. 大数据行业最顶尖明星人才TOP20
  20. 手写识别ocr java,OCR 指的是手写文字技术_学小易找答案

热门文章

  1. php.c drcom,成功 将校园客户端drcom搞进openwrt
  2. npm i 安装插件报:permission denied, symlink
  3. Mac升级Catalina,根目录下无法创建个人文件夹
  4. java int类型 BigDecimal类型转成汉字金额大写
  5. 笔记本电脑怎样当无线服务器,笔记本当无线路由器怎么设置【详细步骤】
  6. Verilog AXI Components
  7. Cent os 安装 JDK , 配置JAVA_HOME
  8. 设计模式之桥接模式:如何实现抽象协议与不同实现的绑定?
  9. 如何区分电梯卡为id卡ic卡_门禁卡是选择IC卡好还是ID卡好
  10. vscode 下载地址