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) 收藏 举报
浙公网安备 33010602011771号