最近有个需求是选中某个商品分类时需要递归查询该分类以及 该分类下所有的子分类以及子分类下的子分类等等 的商品,正常来说需要递归查询某个分类以及所有的子孙分类需要使用递归查询,一直到该分类没有子节点为止,但是这样效率是比较慢的,还会造成对数据库的多次访问,为了提高效率,从网上了解学习了下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,具体详细可以去此处浏览