关于connect by 误区讲解,纯属个人心得和经验,有图有文字
本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处。
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 误区讲解,纯属个人心得和经验,有图有文字的更多相关文章
- 一位 iOS 大牛的 BAT面试心得与经验总结,送给正在迷茫 的你!
前言: 目前形势,参加到 iOS 队伍的人是越来越多,可以说是已经达到了供过于求的地步了. 今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,之前实习的时候就想着写一篇面经,后来忙就给忘了, ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(一)GIS一张图的系统开发环境以及flexviewer框架
系统的GIS功能实现是基于arcgis api for flex,首先附上系统的主界面图,接下来的是对主界面的模块功能详细讲解: 一.GIS环境软件安装 (1)arcgis desktop的安装,要是 ...
- Recording︱有价值的各类AI、机器学习比赛心得、经验抄录
今年kaggle华人优胜团队很多,所以经验.心得不少,都是干货慢慢收集. 一.[干货]Kaggle 数据挖掘比赛经验分享 github:https://github.com/ChenglongChen ...
- 足球运动训练心得及经验分析-c语言学习调查
在准备预备作业02之前,我参考娄老师的提示,阅读了<[做中学(Learning By Doing)]之乒乓球刻意训练一年总结>一文. 在文章描述的字里行间,给予我的印象是系统.负责,娄老师 ...
- 初学深度学习(TensorFlow框架的心得and经验总结)自用环境的总结
初学者的时间大部分浪费在了环境上了: 建议直接上Linux系统,我推荐国产的深度系统,deepin这几年一直在不断的发展,现在15.4已经很不错了 1,图形化界面很漂亮,内置正版crossover,并 ...
- 【原创】使用Kettle的一些心得和经验
用kettle做etl也有段时间了,遇到很多问题,总结了一下. [关于版本的问题] kettle常用的版本有4.1和4.4,对于4.1版本: 1.该版本的兼容性有点差,在某些机器上运行会启动失败,或者 ...
- Python使用心得之魔法参数**kw
通过设置字典类型参数直接传递给接收魔法参数(**kw)的方法,对应赋值.示例如下: jdbcConnectionDict = {, , 'database': 'test', 'charset': ' ...
- "Gun N' Rose" Team学习心得
如果我比别人看得更远,只因为我站在巨人的肩膀上. ——牛顿 高级软件工程课程终于开课了!第 ...
- php框架tp3.2.3和js写的微信分享功能心得,分享的标题内容图片自定义
https://blog.csdn.net/weixin_42231483/article/details/81585322 最近用PHP的tp3.2.3框架和js写的微信分享功能心得,分享的标题内容 ...
随机推荐
- 20162328蔡文琛 week10 大二
20162328 2017-2018-1 <程序设计与数据结构>第十周学习总结 教材学习内容总结 理解图与有向图.无向图 理解带权图 会应用带权图 理解图的广度优先遍历和深度优先遍历 掌握 ...
- wdatepicker控件de使用小方法汇总
在总结wdatepicker控件的使用前,先插播一条吧,下午刚心血来潮百度的一条 问?C#中Int16.Int32.Int64.之间的区别,:::嘿嘿其实百度知道就有,但还是写上吧! Int16 表示 ...
- Task 4.3 求环形数组的最大子数组和
任务要求:输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n- ...
- Leetcode题库——15.三数之和
@author: ZZQ @software: PyCharm @file: threeSum.py @time: 2018/10/6 19:47 说明:给定一个包含 n 个整数的数组 nums,判断 ...
- springboot maven
更多信息请从官网获取https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE 1.parent基于自己项目而非spring-boot-starter- ...
- Centos7 虚拟机复制后网卡问题 Job for network.service failed
在运行“/etc/init.d/network restart”命令时,出现错误“Job for network.service failed. See 'systemctl status netwo ...
- RHEL/Centos下VSFTPD服务器搭建
目的 Linux下安装配置vsfptd服务器,并通过客户端验证. 环境 Centos 6 局域网 内容 配置Vsftpd服务器:实现匿名用户.本地用户和虚拟用户登录的配置.匿名用户可以上载文件,上载后 ...
- how to insert js to iframe page in order to disabled open new page/window
how to insert js to iframe page in order to disabled open new page/window js 禁用 iframe 中的页面打开新页面 htt ...
- BZOJ3252 攻略(贪心+dfs序+线段树)
考虑贪心,每次选价值最大的链.选完之后对于链上点dfs序暴力修改子树.因为每个点最多被选一次,复杂度非常正确. #include<iostream> #include<cstdio& ...
- Vector源码解析
概要 学完ArrayList和LinkedList之后,我们接着学习Vector.学习方式还是和之前一样,先对Vector有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它.第1部分 Vec ...