Oracle递归查询startwithconnectbyprior用法详解
(2017-03-03 17:07:26)
标签:
startwithconnectbyproracle递归查询示例oracle递归查询详解oracle树形结构查询详connectbyprior |
分类: Oracle数据库 |
下面我们来看下具体的示例:
一、递归函数的语法
select *
from 表名
[where 条件1]
start with [条件2]
connect by [条件3];
参数说明:
其中connect by 与start with 语句摆放的先后顺序不影响查询的结果,[where 条件1]可以不需要。[where 条件1]、[条件2]、[条件3]各自作用的范围都不相同。
[where 条件1] 是在根据“start with [条件2] connect by [条件3]”选择出来的记录进行过滤,是针对单条记录的过滤,不会考虑树的结构。
[条件2] 限定作为搜索起始点的条件,如果是自上而下的搜索则是限定作为根节点的条件,如果是自下而上的搜索则是限定作为叶子节点的条件。
[条件3] 指定构造树的条件,以及对树分支的过滤条件,在这里执行的过滤会把符合条件的记录及其下的所有子节点都过滤掉。
start with与connect by prior语句完成递归记录,形成一棵树形结构,通常可以在具有层次结构的表中使用。
start with 表示开始的记录。
connect by prior 指定与当前记录关联时的字段关系代码。
prior 存在于[条件2]中,可以不要,不要的时候只能查找到符合“start with [条件3]”的记录,不会再寻找这些记录的子节点。在使用时有两种写法:
connect by prior dep_id=pid :表示采用自上而下的搜索方式(先找到父节点,然后找子节点),一般用户根据父节点查找子节点的情况;
connect by dep_id=prior pid :表示采用自下而上的搜索方式(先找叶子节点,然后找父节点),一般用于根据子节点查找父节点的情况。
二、创建部门测试表
--创建部门表,这是一个具有层次结构的表,子记录通过parent_id与父记录的id进行关联
drop table tmp_dept;
create table tmp_dept(
dep_id
dep_name
pid
);
-- 添加测试数据
insert into tmp_dept
select 101,'家喻销售有限公司',null from dual
union
select 1001,'研发部',101 from dual
union
select 1002,'财务部',101 from dual
union
select 1003,'销售部',101 from dual
union
select 1004,'产品部',101 from dual
union
select 1005,'市场部',101 from dual
union
select 10011,'研发一部',1001 from dual
union
select 10012,'研发二部',1001 from dual
;
commit;
--查看数据
select * from tmp_dept;
---------- -------------------------------------------------------------------------------- ----------