connect by 扫描树结构表---1
我们在学习或工作的过程中,经常会遇到以树或者森林存储的数据表。而很多不了解这种结构的童鞋经常不知道该从何处下手,从何处开始扫描遍历或者如何遍历这样的结构。我也是在学习的过程中整理出一些程序,跟大家分享,有不足之处,望大家多多指正,欢迎吐槽,共同学习。
下面我们先看这样一个森林:
两棵二叉树构成了一个森林,下面我们把以上两棵树存储到同一张二维表中:
ID | PARENT_ID |
A | 0 |
B | A |
C | A |
D | B |
E | C |
F | C |
G | D |
H | E |
I | 0 |
J | I |
K | I |
上表中,根节点对应的parent_id 默认为'0',下面我们开始介绍connect by 对表结构的扫描(我们假设上表名称为Element_tree)。
1、对整个森林的扫描遍历
select * from element_tree start with parent_id = '0' connect by prior id = parent_id;
start with 代表遍历开始的地方,这里可以对应一个元素值,也可以对应一组元素值;connect by对数据进行遍历扫描。
这里要说明的是prior的位置,如果位于等号之前,以“start with” 后对应的节点为根节点自上而下扫描,直到扫描完子树为止。而当prior位于等号之后,则以"start with" 之后对应的节点为叶子节点,自下而上扫描,直到扫描完根节点为止。
另外,"start with"的位置可以再"connect by"之前,或之后,两种写法无差别。
2、对指定子树的自上而下扫描
1 select * 2 from element_tree 3 start with id = 'C' 4 connect by prior id = parent_id;
以上语句是一个自上而下的扫描,输出结果为以C为根节点的子树C、E、F、H所对应的数据行。
3、对指定节点的自下而上扫描
1 select * 2 from element_tree 3 start with id = 'H' 4 connect by id =prior parent_id;
以上语句是以H为叶节点的自下而上的扫描,循环扫描至根节点为止,输出结果为元素H、E、C、A所对应的数据行。
4、省略prior的connect by语句
1 select * 2 from element_tree 3 connect by id = parent_id 4 start with id = 'B';
上边语句省略了prior关键字,connect by则不循环遍历数据,查询结果只返回id='B'的数据行。
希望大家通过以上几个简单的例子,对connect by的基本用法有所了解。