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

相关推荐
Nil20821 小时前
leetcode 118杨辉三角
算法·leetcode·职场和发展
wanderist.1 天前
线性筛法详解:从筛质数到欧拉函数、Möbius 函数与约数函数
java·数据结构·算法
All for pursuit.1 天前
【设计-1】208.实现Trie (前缀树)
数据结构·c++·算法·leetcode
weixin_307779131 天前
C++代码实现MATLAB中的crossval函数功能
开发语言·c++·算法·matlab
青少儿编程课堂1 天前
背包问题(0/1 背包与完全背包)解题精讲——动态规划入门
c++·python·算法·bfs·信息学竞赛
Nturmoils1 天前
GROUP BY 先别想当然,查汇总前把规则跑清楚
数据库
光影少年1 天前
为什么 JavaScript 中 0.1 + 0.2 !== 0.3,如何让其相等?
前端·javascript·算法
最笨的羊羊1 天前
Oceanbase数据库系列之:向量数据库核心知识
数据库·oceanbase
HEJOO91 天前
Linux 设备驱动系列——使用全局工作队列
java·linux·算法
fish_xk1 天前
mysql中的表的约束
数据库·mysql