递归调用函数 connect by prior

 

     connect by prior start with 经常会被用到一个表中存在递归关系的时候。比如我们经常会将一个比较复杂的目录树存储到一个表中。或者将一些部门存储到一个表中,而这些部门互相有隶属关系。这个时候你就会用到connect by prior start with。

典型的使用方法就是:
select * from table connect by prior cur_id=parent_id start with cur_id=???
例如:

 id child parent
1     1      0
2     2      0
3     3      2
4     4      2
5     6      2
6     7      1
7    78     3
8    36     3
9    11     4
10  22     6
在上表中,如果要查找child=2的所有数据,包含他的父节点和所有他的子节点,则:
select t.*  from ttt t connect by prior Child=parent start with Child=2
 id child parent
1    2     0
2    3     2
3   78    3
4   36    3
5    4     2
6   11    4
7    6     2
8   22    6

我们可以看到,通过根节点Child=2的查询得到了2的子节点3,4,6。
然后再次以这些为根节点遍历出他们的子节点,最终反映出所有2的子节点记录。如果有互为父子的情况,就会出现循环错误!

这些只是基础,皮毛。其实只要你灵活的构造查询语句。可以得出意想不到的结果。比如生成树每一个路径。
但是这些记录组成的树必须正常才可以

select * from tb_cus_area_cde

--子取父
select t.*  from ttt t connect by prior parent=Child start with Child=78
 id child parent
1   78     3
2    3      2
3    2       0
查找出child子节点的所有上级的记录,

--父取子
select t.*  from ttt t connect by prior Child=parent start with Child=2

通过以上的对比可以看到,遍历是自上而下,还是由子节点向根节点遍历,完全取决于(parent=Child , Child=parent )两个字段的顺序。一般来说,第一个字段表明子节点遍历的方向,parent=Child 表明向parent肤节点方向遍历,Child=parent 表明向子节点方向遍历
注意:在用这个函数的时候,statement的参数要用 ResultSet.TYPE_SCROLL_INSENSITIVE   而不能用 ResultSet.TYPE_SCROLL_SENSITIVE,在这里再把这两个之间的区别讲讲:

1.TYPE_FORWORD_ONLY,只可向前滚动;  
   
2.TYPE_SCROLL_INSENSITIVE,双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。  
   
3.TYPE_SCROLL_SENSITIVE,双向滚动,并及时跟踪数据库的更新,以便更改ResultSet中的数据

<script type="text/javascript"></script> <script src="http://www.javaeye.com/javascripts/se_hilite.js?1224057847" type="text/javascript"></script> <script type="text/javascript"></script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值