Oracle递归查询

在数据库查询中常常会碰到要查询树形结构的数据,需要用一个字段的数据当做下一条记录的父节点继续查询,如果在不知道有多少级节点的情况下一次次手写SQL查询会很繁琐而没有效率,这时可以使用

oracle中的connect with prior递归算法:
Oracle中start with...connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是:
select ... from tablename
start with 条件1       --指定递归查询中的根节点(开始节点)
connect by 条件2
where 条件3;
例:
select * from table
start with org_id = 'HBHqfWGWPy'
connect by prior org_id = parent_id;
 
在实际使用时遇到两个问题,一是如果把where子句放在start with...connect by...子句后时会提示:ORA-00933:SQl命令未完全结束。此时光标置于where处,如果将where放在 start with...connect by...子句前则可以正常执行。二是查询的数据中不能有自循环,即例子中的 org_id parent_id 在同一条记录中不能相等,否则会提示:ORA-01436:用户数据中的connect by 循环。这两点需要注意。
 
 
其实Oracle9以后,提供了一种排序order siblings by”就可以实现我们的需求,用法如下:

select d.* from test_tree d

start with d.pid=0

connect by prior d.id=d.pid

order siblings by d.ind asc

posted @ 2012-10-29 10:25  阳光温暖了心情  阅读(554)  评论(0编辑  收藏  举报