本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处。

  http://www.cnblogs.com/king-xg/p/6927541.html

  如果觉得对您有帮助,请点击推荐或收藏本博客,谢谢。

1. 使用了connect by 的人,大多会存在一些疑问:

  a. start with 后接的节点不同导致查询的方向(上或下)不同?

  b. prior 关键字理解?

  c. 突然出现的诸多冗余数据是怎么来的?

案例数据集就拿我上一篇博客的案例表来用了(删掉了循环列)

树形展示图:

  

  问题解答:

    答:  1. start with 仅仅只是指定从那个节点开始,并不是上下查询的判断

       2. start with 在向下查询时,仅有一点不同,后接子节点列则查询会比后接父节点列多一条记录,多出来的一条记录就是起始节点列,即,后接子节点列会查出起始行,后接父节点列则不会查询出起始行

        3. 只有connect by语句中的prior关键字的位置决定了上下查询的方向,补充一下,如何判断上下查询

          (a). 死记 prior 子节点列 = 父节点列 [向下查询],prior 父节点列 = 子节点列 [向上查询]

          (b). 另一种更方便一点,“prior 子节点列 = 父节点列 [向下查询]”  就把proir 翻译成"以...为查询条件",那么就是这样翻译的"以子节点列为查询条件,查询父节点列",举例:"prior emp_id = lead_id" 翻译之后就是"以emp_id为查询条件查询lead_id",即向下查询,这样理解起来是不是感觉很简单了;

        4. 向上查询的两种特殊情况,(1). 后接子节点列   (2). 后接父节点列

        5.多出的冗余数据会在如下情况中出现

        (a). 向上查询且start with 后接父节点列时

        (b). sql语句中不包含start with 关键字时

    讲解:

      问题-向上查询的两种特殊情况:

        向下查询且后接子节点列与向下查询且后接父节点列查询的结果集:

select emp_id,lead_id,emp_name,prior emp_name as lead_name,salary
from employee
start with emp_id=
connect by prior emp_id = lead_id ;

 select emp_id,lead_id,emp_name,prior emp_name as lead_name,salary
from employee
start with lead_id=
connect by prior emp_id = lead_id ;

少了一行记起始记录,当然也可以使结果集不缺少记录,前提是其实行需定位到同一行

 select emp_id,lead_id,emp_name,prior emp_name as lead_name,salary
from employee
start with lead_id=
connect by prior emp_id = lead_id ;

解释: lead_id=0和emp_id=1指向的是同一行

        

   问题-冗余数据的产生情况:     

    (1). 向上查询且后接父节点列时   

   

  select emp_id,lead_id,emp_name as lead_name,prior emp_name as emp_name,salary
from employee
start with lead_id=
connect by emp_id = prior lead_id
order by lead_id;

多了两条冗余记录,其实根据数据不难看出冗余的是起始节点记录的所有父节点和祖先节点的记录行

画图分析:

所以一般不建议向上查询时start with后接父节点列,这样会造成很多冗余数据行,拖慢了查询速度。

强烈建议: 需要查询父节点行或祖先记录行时,可以用向上查询且后接子节点列

举例:

  select emp_id,lead_id,emp_name as lead_name,prior emp_name as emp_name,salary
from employee
start with emp_id=
connect by emp_id = prior lead_id
order by lead_id;

      (2). sql语句中不包含start with 关键字时,同样也会产生冗余数据行,而且比上面的更多原因就在下面:

  举例:

  

  select emp_id,lead_id,emp_name,prior emp_name as lead_name,salary
from employee
connect by prior emp_id = lead_id

产生了10条冗余数据行,为什么呢?

其实很简单,由于缺少start with 指定起始行,那么oracle会根据proir修饰的字段进行一个内部的动态指定起始行位置,规则是由上至下,由左至右。

首先,指定起始节点为根节点(king),向下查询,然后指定子节点之一(jack)为起始节点,再向下查询,然后指定子节点之一(arise)为起始节点,再向下查询,....循环往复,直到到达最右侧最下方的叶子节点为止。

这里大家可能就会想,为什么是向下查询,而不是向上呢,原因就在于proir 的为止或者说他所修饰的列是子节点列还是父节点列有关,翻译一下就是"以子节点列为匹配条件,查询父节点",这么一看知道是向下查询喽。

同理,connect by  emp_id = prior  lead_id 这个表示向上查询,其他同理~_~

关于connect by 误区讲解,纯属个人心得和经验,有图有文字的更多相关文章

  1. 一位 iOS 大牛的 BAT面试心得与经验总结,送给正在迷茫 的你!

    前言: 目前形势,参加到 iOS 队伍的人是越来越多,可以说是已经达到了供过于求的地步了. 今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,之前实习的时候就想着写一篇面经,后来忙就给忘了, ...

  2. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(一)GIS一张图的系统开发环境以及flexviewer框架

    系统的GIS功能实现是基于arcgis api for flex,首先附上系统的主界面图,接下来的是对主界面的模块功能详细讲解: 一.GIS环境软件安装 (1)arcgis desktop的安装,要是 ...

  3. Recording︱有价值的各类AI、机器学习比赛心得、经验抄录

    今年kaggle华人优胜团队很多,所以经验.心得不少,都是干货慢慢收集. 一.[干货]Kaggle 数据挖掘比赛经验分享 github:https://github.com/ChenglongChen ...

  4. 足球运动训练心得及经验分析-c语言学习调查

    在准备预备作业02之前,我参考娄老师的提示,阅读了<[做中学(Learning By Doing)]之乒乓球刻意训练一年总结>一文. 在文章描述的字里行间,给予我的印象是系统.负责,娄老师 ...

  5. 初学深度学习(TensorFlow框架的心得and经验总结)自用环境的总结

    初学者的时间大部分浪费在了环境上了: 建议直接上Linux系统,我推荐国产的深度系统,deepin这几年一直在不断的发展,现在15.4已经很不错了 1,图形化界面很漂亮,内置正版crossover,并 ...

  6. 【原创】使用Kettle的一些心得和经验

    用kettle做etl也有段时间了,遇到很多问题,总结了一下. [关于版本的问题] kettle常用的版本有4.1和4.4,对于4.1版本: 1.该版本的兼容性有点差,在某些机器上运行会启动失败,或者 ...

  7. Python使用心得之魔法参数**kw

    通过设置字典类型参数直接传递给接收魔法参数(**kw)的方法,对应赋值.示例如下: jdbcConnectionDict = {, , 'database': 'test', 'charset': ' ...

  8. "Gun N' Rose" Team学习心得

    如果我比别人看得更远,只因为我站在巨人的肩膀上.                                                        ——牛顿 高级软件工程课程终于开课了!第 ...

  9. php框架tp3.2.3和js写的微信分享功能心得,分享的标题内容图片自定义

    https://blog.csdn.net/weixin_42231483/article/details/81585322 最近用PHP的tp3.2.3框架和js写的微信分享功能心得,分享的标题内容 ...

随机推荐

  1. JavaScript实现大整数减法

    继上一篇博文写了大整数加法之后,我又模拟上篇博文的算法,自己实现了大整数减法. 大整数减法相对于加法来说,稍微复杂一点.由于要考虑一些情况: 1. 两个数相减,可能会出现结果为正.负和0三种情况: 2 ...

  2. 第二阶段Sprint冲刺会议8

    进展:重新规划主界面,把视频录制暂放到主页面里,先实现功能,视频提醒后期再做.

  3. 《Spring2之站立会议6》

    <Spring2之站立会议6> 昨天,向主界面中加入语音功能部分的代码: 今天,查相关资料解决debug: 遇到问题,一些问题是得到解决了,但是一些还未被解决.

  4. 路由器配置及IP设置及ping命令使用

    OSI的七层协议体系结构: 物理层.数据链路层.网络层.运输层.会话层.表示层.应用层 TCP/IP是一个四层的体系结构: 网络接口层.网际层(互联网层)(IP或ARP或ICMP).运输层(TCP或U ...

  5. Beta阶段——第四篇 Scrum 冲刺博客

    i. 提供当天站立式会议照片一张: ii. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 充值与账单的数据库操作结合,实现余额功能 (2) 今天计划完成的工作: 用户权限 ...

  6. 6th Alpha阶段的postmortem报告

    组名:好好学习(代组长发布)  会议重要内容记录: 1.  尝试在beta阶段实现的功能,与alpha阶段相比的优势 (1)更改软件现有的bug: 1)软件的账目只能输入,但是一旦发生失误却无法更改和 ...

  7. python 安装pymssql

    error: command 'gcc' failed with exit status 1 ---------------------------------------- Command &quo ...

  8. SpringBoot(六)_AOP统一处理请求

    什么是AOP AOP 是一种编程范式,与编程语言无关: 将通用逻辑从业务逻辑中分离出来(假如你的业务是一条线,我们不在业务线上写一行代码就能完成附加任务!我们会把代码写在其他的地方): 具体实现 (1 ...

  9. Spring Boot 推荐的 Java 配置

    在学 Spring 的过程中 , 配置文件慢慢的被注解所替代 , 现在 Spring Boot 更是推荐使用 Java 配置完全来代替配置文件 . 需要使用到的注解有 : Bean 相关 : @Con ...

  10. 一文总结之Redis

    目录 Redis 目标 Redis简介 什么是Redis 特性 Redis当前应用情况 安装 基本使用 键 exists判断键存在性.del删除键.type键类型 expire key的时效性设置 基 ...