Oracle递归查询举例

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

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