数据恢复咨询热线:400-666-3702  

欢迎访问南京兆柏数据恢复公司,专业数据恢复15年

兆柏数据恢复公司

 常见问题

 当前位置: 主页 > 常见问题

Oracle数据库递归查询

浏览量: 次 发布日期:2023-10-15 20:13:19

Oracle数据库递归查询

上海数据恢复

最近在做一个树状编码管理系统,其中用到了oracle的树状递归查询(关键字:SELECT ... WHERE... START WITH ... CONNECT BY PRIOR) 以后开发树状菜单、树状评论、树状文件结构,只要和树扯得上关系的都可以应用,前提是你用的是oracle数据库

以上数据PID为0的表示根节点,根节点可以有多个,根节点的PID最好不要用NULL,此时会引起全表扫描。 按照层级关系展示如下:

查询ID为1的节点的儿子

常州数据恢复

查询ID为6的节点的所有亲兄弟节点

从ID为1的节点开始,查询所有属于它的子节点,包括儿子,儿子的儿子,儿子的儿子的儿子,儿子的儿子的儿子....无限个儿子

当然,你也可以加WHERE条件,不要名称中含有房东的儿子节点

甚至可以指定多个根节点

这个和上面查找某节点所有子节点(自顶向下的树状)的唯一区别就是PID和ID的位置交换了,上面能用的WHERE和IN这里也能用,不再赘述

不管节点是属于哪个根节点的,只要在同一层级都可以查询出来,和查询某节点所有兄弟节点的不同之处在于,前者是查询亲兄弟,后者是所有兄弟,不管是亲兄弟,堂兄弟,表兄弟 用临时表保存层级信息(LEAF),然后从临时表中查询传入ID的层级,最后查询所有在同一层级的节点

可以看到,上面的所有节点都是2层级,本文最开始的层级关系展示图可以用下面的SQL查询出来,LPAD函数可适当调整

此查询在对每个节点进行分类和其他表联查的时候比较有用

自顶向下路径查询

自下向上路径查询 注意和自顶向下的在效率上的区别,引用别人的一句话

在这里我又不得不放个牢骚了。oracle只提供了一个sys_connect_by_path函数,却忘了字符串的连接的顺序。在上面的例子中,第一个sql是从根节点开始遍历,而第二个sql是直接找到当前节点,从效率上来说已经是千差万别,更关键的是第一个sql只能选择一个节点,而第二个sql却是遍历出了一颗树来。再次ps一下。https://www.cnblogs.com/linjiqin/p/3152674.html

查询树状始终显示根节点

动态查询是否是叶子节点,是叶子节点表示该节点没有儿子了,否则有儿子,ORACLE自带的CONNECT_BY_ISLEAF能动态显示是否叶子节点,1是0否

相关推荐