oracle中关于connect by的语法及实现(前序遍历树)

语法

connect by是是结构化查询中用到的,其基本语法是:

1 select ... from tablename

2 start with 条件1

3 connect by 条件2

4 where 条件3;

使用示例

例:

sql 复制代码
create table tree(id int,parentid int);
insert into tree values(120,184);
insert into tree values(121,120);
insert into tree values(122,120);
insert into tree values(123,120);
insert into tree values(124,122);
insert into tree values(125,123);
insert into tree values(126,123);
insert into tree values(127,125);
insert into tree values(128,125);
select id from tree start with id = 120 connect by prior id = parentid;

id

120

123

126

125

128

127

122

124

121

语法详解

简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:org_id,parent_id,那么通过表示每一条记录的parent是谁,就可以形成一个树状结构,用上述语法的查询可以取得这棵树的所有记录,其中:

条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。

条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR id = parent_id;就是说上一条记录的id 是本条记录的parent_id,即本记录的父亲是上一条记录。

条件3 是过滤条件,用于对返回的所有记录进行过滤。

简单介绍如下:

在扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下:

第一步:从根节点开始;

第二步:访问该节点;

第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步;

第四步:若该节点为根节点,则访问完毕,否则执行第五步;

第五步:返回到该节点的父节点,并执行第三步骤。

总之:扫描整个树结构的过程也即是前序遍历树==(数据库存储不区分左右)==的过程。(如上图)

子句使用介绍

START WITH

START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点,若该子句被省略,则表示所有满足查询条件的行作为根节点。

START WITH:不但可以指定一个根节点,还可以指定多个根节点。

CONNECT BY

CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIOR运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。

PRIOR

运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。

PRIOR被置于CONNECT BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如:

CONNECT BY PRIOR EMPNO=MGR

PIROR运算符被置于CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如:

CONNECT BY EMPNO=PRIOR MGR

相关推荐
ゞ 正在缓冲99%…1 天前
leetcode35.搜索插入位置
java·算法·leetcode·二分查找
lifallen1 天前
字节跳动Redis变种Abase:无主多写架构如何解决高可用难题
数据结构·redis·分布式·算法·缓存
专注代码七年1 天前
查询 mysql中 所有的 非空记录字段
数据库·mysql
a.3021 天前
OpenCV(cv2)学习笔记:从模板匹配入门到常用函数
数据库·ubuntu·ssh
大视码垛机1 天前
速度与安全双突破:大视码垛机重构工业自动化新范式
大数据·数据库·人工智能·机器人·自动化·制造
feifeigo1231 天前
星座SAR动目标检测(GMTI)
人工智能·算法·目标跟踪
WWZZ20251 天前
视觉SLAM第10讲:后端2(滑动窗口与位子图优化)
c++·人工智能·后端·算法·ubuntu·机器人·自动驾驶
YuTaoShao1 天前
【LeetCode 每日一题】36. 有效的数独
linux·算法·leetcode
IT古董1 天前
【漫话机器学习系列】003.Agglomerative聚类
人工智能·算法·机器学习