ORACLE查询树型关系start with connect by prior

在oracle中的select语句能够用start with...connect by prior子句实现递归查询。其基本语法是:sql

select LEVEL,t.* from tablename t
where cond3
start with cond1
connect by cond2; 

注意:这里的where条件是放在tablename后面,若是放在cond2后面,执行查询报sql命令未正确结束的错误。oracle

cond1:是根结点的限定语句,固然能够放宽限定条件,以取得多个根结点,实际就是多棵树。 spa

cond2:是链接限定条件,格式为“PRIOR 列名1=列名2” 或 “列名1=PRIOR 列名2”。其中用prior表示上一条记录,好比connect by prior id=parentid就是说上一条记录的ID是本条记录的parentid,即本记录的父亲是上一条记录。 code

cond3:是结果过滤条件,用于对返回的全部记录进行过滤(即在树查询出来后再进行过滤)。 排序

简单说来是将一个树状结构存储在一张表里,好比一个表中存在两个字段: id,parent_id
那么能够经过该查询表示每一条记录的parent是谁,就能够造成一个树状结构。 递归

一、关于start with
START WITH 子句为可选项,用来标识哪一个节点做为查找树型结构的起始节点。若该子句被省略,则表示全部知足查询条件的行做为起始节点。不但能够指定一个起始节点,还能够指定多个起始节点。ci

二、 关于 PRIOR
在自顶向下查询树结构时,不但能够从根节点开始,还能够定义任何节点为起始节点,以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。运算符 PRIOR 被放置于等号先后的位置,决定着查询时的检索顺序。
PRIOR 被置于 CONNECT BY 子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向经过树结构,咱们称之为自顶向下的方式。如:
CONNECT BY PRIOR EMPNO=MGR
PIROR 运算符被置于 CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向经过树结构,咱们称之为自底向上 的方式。例如:
CONNECT BY EMPNO=PRIOR MGR
在这种方式中也应指定一个开始的节点。it

三、使用LEVEL
在具备树结构的表中,每一行数据都是树结构中的一个节点,因为节点所处的层次位置不一样,因此每行记录均可以有一个层号。层号根据节点与根节点的距离肯定。不论从哪一个节点开始,该起始节点的层号始终为1 ,起始节点的子节点为2,依此类推。io

四、节点和分支的裁剪
在对树结构进行查询时,能够去掉表中的某些行,也能够剪掉树中的一个分支,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。table

五、排序显示
像在其它查询中同样,在树结构查询中也能够使用ORDER BY子句,改变查询结果的显示顺序,而没必要按照遍历树结构的顺序。
--------------------------------------------------------------------------------

分割线

--------------------------------------------------------------------------------

上面简单介绍了oracle树结构查询语法,下面说明下实际应用中,因重复数据致使的特殊状况
 场景:一张表test_table中存储每一个核心系统source,且每一个source有本身专业机构id,每一个专业机构下有相应的下级机构。但各个核心间的机构id存在重复。表数据如表1所示。

表1

id parent_id source
201 1 核心1
1   核心1
20108 201 核心1
20108 201 核心2
201 2 核心2
2   核心2


表2

id parent_id source
20108 201 核心1
201 1 核心1
1   核心1
201 2 核心2
2   核心2
20108 201 核心2
201 1 核心1
1   核心1
201 2 核心2
2   核心2

表3

id parent_id source
20108 201 核心1
201 1 核心1
1   核心1
201 1 核心1
1   核心1

实际数据为核心1有专业机构为id=1,二级机构为id=201,三级机构为id=20108;核心2有专业机构为id=2,二级机构为id=201,三级机构为id=20108。

若是在不知道表内具体数据的状况下,直接使用如下语句从三级机构id=20108遍历查询其根节点,结果如表2所示。致使该缘由是20108存在重复,201也存在重复,分别关联递归出多个树结构。

select * from test_table t
start with t.id = '20108'
connect by t.id = prior t.parent_id;

若是此时加上where条件,只查询核心系统1的三极机构id=20108对应的机构树结构。效果如表3所示。很明显where条件只是在表2的基础上进行再次筛选而已,结果不是咱们想要的三级层次树结构。

select * from test_table t
where t.source = '核心1'
start with t.id = '20108'
connect by t.id = prior t.parent_id;

解决因不一样核心数据重复致使关联出多个树结构问题,只需将限定条件加在start with和connect by上便可。具体SQL以下,效果详见表4。

select * from test_table t
start with (t.id = '20108' and t.source = '核心1')
connect by (t.id = prior t.parent_id and t.source = '核心1');

表4

id parent_id source
20108 201 核心1
201 1 核心1
1   核心1
相关文章
相关标签/搜索