oracle+plsql

SELECT * FROM people start with id = 3 connect by id = prior parentid

  

一、递归查询之start with关键字

1.基本用法:

SELECT ... FROM    + 表名
WHERE              + 条件3
START WITH         + 条件1
CONNECT BY PRIOR   + 条件2

  

   

测试用例数据及结构如上

既然是递归查找,那当然是树形结构了。

SELECT * FROM people start with id = 3 connect by prior id = parentid and  id<>6

2.下面对各个条件进行解释:

  条件一是进行开始查找的根节点,所以是跟在start with后。(可选)

  条件二是节点间进行关联的条件,所以是跟在connect by 关键字之后。本例子中是通过id和parentid进行关联的。

  条件三是普通的查询条件。(可选)

  当然prior 关键字是很重要的,条件二中修饰关联的条件,没有prior时则默认关联本条数据。

  prior的语法理解是,prior修饰的属性是前一条数据的,而等号另一侧的属性是所要查找的本条数据。

  直观的理解是,prior修饰的属性是父节点,则对树进行向上遍历。反之,修饰子节点属性,则向下遍历。

3.数据测试

SELECT * FROM people start with id = 3 connect by prior id = parentid 

SELECT * FROM people start with id = 3 connect by id = prior parentid

 

4.补充

 当然,数据可能不是严格的树形结构,并且存在儿子是爷爷的爸爸这种情况时。

大概就是这种情况,老孙子是爷爷的父节点。

就会出现 ORA-01436: CONNECT BY loop in user data(关联数据存在循环)

使用connect by nocycle 便可以解决。

connect by 和 start with 顺序是不固定的,start with。

关于siblings关键字

参考:https://blog.csdn.net/weiwenhp/article/details/8218091

posted on 2018-08-13 16:18  JavaZhangJS  阅读(178)  评论(0)    收藏  举报

导航