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的基本用法有所了解。

posted on 2012-08-29 22:45  Rigwarl.Z  阅读(450)  评论(0编辑  收藏  举报

导航