关于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写的微信分享功能心得,分享的标题内容 ...
随机推荐
- jsp九大内置对象之session和application
session和application 用的都是特别多尤其是application,但是想全面学习一下内置对象所以都了解一下. session又被称为是会话生存期是用户进入浏览器到关闭浏览器的期间.s ...
- Alpha版本冲刺(八)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- 13_Java面向对象_第13天(static、final、匿名对象、内部类、包、修饰符、代码块)_讲义
今日内容介绍 1.final 关键字 2.static 关键字 3.匿名对象 4.内部类 5.包的声明与访问 6.访问修饰符 7.代码块 01final关键字概念 A: 概述 继承的出现提高了代码的复 ...
- Prism6下的MEF:第一个Hello World
最近看书比较多,正好对过去几年的软件开发做个总结.写这个的初衷只是为了简单的做一些记录. 前言 复杂的应用程序总是面临很多的页面之间的数据交互,怎样创建松耦合的程序一直是多数工程师所思考的问题.诸如依 ...
- 二叉查找树ADT--C语言描述
首先给出此ADT的声明: struct TreeNode; typedef struct TreeNode *Position; typedef struct TreeNode *SearchTree ...
- Scrum Meeting Beta - 6
Scrum Meeting Beta - 6 NewTeam 2017/12/5 地点:主南201 任务反馈 团队成员 完成任务 计划任务 安万贺 完成了离线状态本地存储的读取Issue #133Pu ...
- label上的事件操作执行两次
label上的事件执行两次 标签(空格分隔): 事件执行两次 今天在做公司项目的过程中,需要在表单元素单选框上绑定事件,执行相应的操作,结果发现事件执行了两次 具体代码: <div class= ...
- docker 建立私有仓库,24.205为镜像仓库所在主机
一.下载registry #yum install -y python-devel libevent-devel python-pip gcc xz-devel #python-pip install ...
- Idea使用Mybatis Generator 自动生成代码
(1)创建一个maven工程 (2)配置pom文件 <dependencies> <dependency> <groupId>mysql</groupId&g ...
- Java乐观锁、悲观锁
乐观锁 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号 ...