关于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写的微信分享功能心得,分享的标题内容 ...
随机推荐
- 如何知道一个App的包名呢
包名(Package name)是Android系统中判断一个APP的唯一标识 记录我获取包名的几种方式 方法一:通过cmd命令,打开你要获取包名的APP 1.adb shell 2.dumpsys ...
- 关于mybatis的思考(1)——mybatis的使用实例
架构分析 MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架. MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索.MyBatis 可以使用简 ...
- 牛客网国庆集训派对Day5 题目 2018年
链接:https://www.nowcoder.com/acm/contest/205/L来源:牛客网参考博客:https://blog.csdn.net/HTallperson/article/de ...
- Akka系列---什么是Actor
本文已.Net语法为主,同时写有Scala及Java实现代码 严肃的说,演员是一个广泛的概念,作为外行人我对Actor 模型的定义: Actor是一个系统中参与者的虚拟人物,Actor与Actor之间 ...
- cobbler-web 界面技术详解
cobbler-web安装配置过程详解 (1)安装cobbler-web(测试时候,确保物理网络是在内网中进行,在外网会无法访问的哦,cobbler-web的访问入口必须有dhcpd指定的网络保持一致 ...
- Python3.6 AES加密 pycrypto 更新为 pycryptodemo | TypeError: Object type <class 'str'> cannot be passed to C code
#!/usr/bin/env python# -*- coding:utf-8 -*-# @author: rui.xu# @update: jt.huang# 这里使用pycryptodemo库# ...
- 刷新dbgrid 而不失去当前行位置
我们有一个Delphi的数据库应用程序,上面有个DBGrid和一个数据集: DBGrid是用来显示来自数据集(查询或表)的数据,根据设计,当您调用已经打开的数据集的Refresh方 法(例如使用DBN ...
- List,Set和Map详解及其区别和他们分别适用的场景
Java中的集合包括三大类,它们是Set(集).List(列表)和Map(映射),它们都处于java.util包中,Set.List和Map都是接口,它们有各自的实现类.Set的实现类主要有HashS ...
- 【Python】Python简介
Python是一种既使用简单又功能强大的高级编程语言,同时支持面向过程的编程和面向对象的编程. 官方对python的介绍:Python 是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简 ...
- nowcoder 203A Knight(贪心+打表)
题目链接 题目描述 有一张无限大的棋盘,你要将马从(0,0)移到(n,m). 每一步中,如果马在(x,y),你可以将它移动到(x+1,y+2),(x+1,y-2),(x-1,y+2),(x-1,y-2 ...