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

​ Oracle这种的start with语句主要对B型树的数据进行递归查询.可以指定数据树上的任一节点,然后查找到它所有的子节点或者父节点.

​ 现在有如下图的数据:

  1. 我们先想数据库插入数据,这里用到oracle的批量插入写法

    # 1 建表
    CREATE TABLE START_WITH (
    sub_levels VARCHAR2(255) NOT NULL ,
    super_levels VARCHAR2(255) DEFAULT ''  NULL
    )
    NOCOMPRESS
    ;
    ​
    # 批量插入方法1
    INSERT INTO START_WITH(sub_levels,super_levels)
                         select  '2','1' from dual
                union all select '3','1' from dual;
    ​
    # 批量插入方法2
    INSERT ALL INTO  START_WITH(sub_levels,super_levels)
                                        VALUES  ('4','2')
        INTO START_WITH VALUES  ('5','2')
        INTO START_WITH VALUES  ('6','3')
        INTO START_WITH VALUES  ('7','3')
        INTO START_WITH VALUES  ('8','4')
        INTO START_WITH VALUES  ('9','4')
    select 1 from dual;
    # 正常写法
    insert into START_WITH(sub_levels,super_levels) values ('10','8');
  2. 使用start with 实例1 -->>查询指定节点下的所有子节点

    
    # 实例1 : 查询指定节点下的所有子节点
    select * from START_WITH
    start with sub_levels = '2'
    connect by prior sub_levels = super_levels
    order by super_levels,sub_levels;

    上面的查询结果如下:

    现在对start with的用法进行解析.

    2.1 start with sub_levels = '2' 这段sql相当进行一个查询 select * from START_WITH where sub_levels = '2' ;

    我们能得到

    2.2 接着看connect by prior sub_levels = super_levels 这段sql 其中的prior sub_levels 表示将2.1中结果的sub_levels作为现在的值,此时这句sql相当于

    connect by 2 = super_levels 这句sql我们可以看做是一个新的查询

    select * from START_WITH super_levels = 2

    ​ 我们能得到结果

    ​ 接着程序会对我么sub_levels 为4的情况执行start with语句和connect by 语句,依次递归直到最后一个子级为止.

    2.3 我们可以将整个查询过程看做是如下流程

  3. 使用start with 实例2 : -->> 查询指定节点下的所有父节点

    
    # 实例2 : 查询指定节点下的所有父节点
    select * from START_WITH
    start with sub_levels = '8'
    connect by prior super_levels = sub_levels
    order by super_levels,sub_levels;

    ​ 结果如下:

    查询过程相当于:

  4. 其余两查询

    
    select * from START_WITH
    start with super_levels = '2'
    connect by prior sub_levels = super_levels
    order by super_levels,sub_levels;


select * from START_WITH
start with super_levels = '8'
connect by prior  super_levels =  sub_levels
order by super_levels,sub_levels;

  1. 总结

    通过上面的结果我们可以发现如下规律

    a. 当在prior 后跟子级时是自上而下的查询所有的子节点

    b. 当在prior后更父级时是自下而上的查询所有的父节点

Oracle中start with xx connect by prior 语句解析相关推荐

  1. oracle中start with和connect by的用法理解

    Oracle中start with和connect by 用法理解 转自:http://www.blogjava.net/xzclog/archive/2010/03/05/314642.html,多 ...

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

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

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

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

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

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

  5. 在Oracle中写出性能优良的SQL语句

    我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器 ...

  6. oracle中的start with connect by用法

    这个子句主要是用于B树结构类型的数据递归查询,给出B树结构类型中的任意一个结点,遍历其最终父结点或者子结点. 先看原始数据: 1 create table a_test2 ( parentid var ...

  7. 测试oracle中set arraysize xx对性能的影响

    arraysize定义了一次返回到SQLPLUS客户端的行数,当扫描了arraysize 行后,停止扫描,返回数据,然后继续扫描. 这个过程就是统计信息中的SQL*Net roundtrips to/ ...

  8. oracle 分隔符行转列,Oracle 中使用 Regexp_substr 和 Connect By 来根据分隔符进行列转行操作示例...

    先查询出数据库中记录 select t.ID,t.存储名称,t.存储路径,t.上传人,t.上传时间 from zlmaindata.投标记录 t 以上为查询结果,我要将[存储名称]多文件名按照分号进行 ...

  9. Oracle中一把梭获取对象DDL创建语句

    文章目录 1.DBMS_METADATA.GET_DDL包详解以及使用案例 1.1.官方文档参考 1.2.常用获取ddl信息案例 1.2.1.查看表以及对应索引创建语句 1.2.2.获取用户下所有对象 ...

最新文章

  1. 1.DBCP和CP30的区别
  2. Sublime Text3前端必备插件
  3. 正则表达式去除括号的问题
  4. 计算机科学论文吧,计算机科学毕业论文.doc
  5. 小白知识摘录__环境变量
  6. jenkins+maven+gitlab触发构建
  7. Cisco 3550交换机IOS备份(真实设备演示)
  8. matlab 指数拟合原理,matlab指数增长和阻滞增长拟合代码.doc
  9. 关于 *.csproj: 找不到此项目类型所基于的应用程序 的解决方案
  10. android 监控行为,一种针对Android系统App行为的监控方法
  11. PLSQL计算日期是当月第几周
  12. 【GDOI2018模拟7.7】暴力大神hxx 树形dp
  13. 【java毕业设计】基于javaEE+原生Servlet+MySql的村镇旅游网站设计与实现(毕业论文+程序源码)——村镇旅游网站
  14. 多少量级才算是高并发
  15. 醍醐灌顶——我眼中的Spring Cloud
  16. 2016年主机游戏大作全方位预测
  17. 七麦数据analysis参数算法还原
  18. 鲲鹏加持,浩瀚深度称量互联网天下再添新砝码
  19. 全球与中国回转窑市场深度研究分析报告
  20. Linux WIFI优先连接5G频段

热门文章

  1. c#中将整数转化为字符串_在C#中将字符串转换为字节数组
  2. c#五个自然日 工作日计算_C#程序输入工作日编号并打印工作日
  3. synchronized底层是如何实现的?
  4. 答读者问:学历不高,要如何破局?
  5. Windows服务的快速搭建与调试(C#图解)
  6. 字符串分割--java中String.split()用法
  7. 操作系统Ubuntu(实验一二)
  8. C语言,你真的弄懂了么?
  9. 任何项目都适用的CMakeLists配置
  10. 动环监控系统接线图_机房动环监控系统报价