2020-11-30 Oracle start with .. connect by查询查询父节点和子孙节点

最近有个需求是选中某个商品分类时需要递归查询该分类以及 该分类下所有的子分类以及子分类下的子分类等等 的商品,正常来说需要递归查询某个分类以及所有的子孙分类需要使用递归查询,一直到该分类没有子节点为止,但是这样效率是比较慢的,还会造成对数据库的多次访问,为了提高效率,从网上了解学习了下sql有没有办法直接实现这样递归查询的功能, Oracle数据库 start with connect by 恰好提供了这样的功能。

  • 表 type 表结构为 ( id varchar2(10) , name varchar2(50), pid varchar2(10) )

  • 语法

select id,name,pid from type where[筛选条件] start with [开始条件] connect by [指定构造树的条件] 

筛选条件: 使用where关键词来对查询出来的记录进行筛选,where是对 start with connenct by…查询出来的记录进行的筛选。是针对单条记录的过滤, 不会考虑树的结构;不需要筛选条件时可以不写where 子句
开始条件: 指定搜索的开始点,如果要查询分类1和2以及他们的子孙分类节点 ,就可以 start with id='1' or id='2' , 限定作为搜索起始点的条件,如果是自上而下的搜索则是限定作为根节点的条件,如果是 自下而上的搜索则是限定作为叶子节点的条件;
指定构造树条件 此处填写构造条件, 比如 通过要通过子节点的pid为父节点的id来查就可以写成 connect by prior id = pid (prior 此处的意思是修饰词 表示父节点一方 , 如果缺少prior关键词则会只查到起始记录) 指定构造树的条件,以及对树分支的过滤条件,在这里执行的过滤会把符合条件的记录及其下的所有子节点都过滤掉;

start with 与 connect by 子句的顺序可以互换,没有影响.

  • 示例: 要查询id为2 和3的分类以及他们的子孙分类,并且分类名不能为a开头的
select id,name,pid where name not like 'a%'
start with id='2' or id='3' 
connect by pid=prior id  --此处也可以写成 prior id= pid


本文参考了https://blog.csdn.net/iushnauh/article/details/83808132,具体详细可以去此处浏览
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值