Oracle递归查询start with connect by prior

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle递归查询start with connect by prior相关的知识,希望对你有一定的参考价值。

参考技术A connect by递归查询基本语法是:

start with:表示以什么为根节点,不加限制可以写1=1,要以id为123的节点为根节点,就写为start with id =123

connect by:connect by是必须的,start with有些情况是可以省略的,或者直接start with 1=1不加限制

prior:prior关键字可以放在等号的前面,也可以放在等号的后面,表示的意义是不一样的,比如 prior id = pid,就表示id就是这条记录的根节点了

举个例子,写条SQL:
t_user(用户表),t_unit_info(单位表),意思是以单位编码为"15803"的单位为根节点,查找出其单位及其子单位的用户信息

然后将prior换一下位置,发现只能查出单位编码为"15803"对应的单位,不能查子级单位

oracle 递归查询start with connect by prior的用法和知识不仅仅这些,本博客只是简单记录一下我所遇到的,网上发现一篇写的比较详细的博客,在Linux公社, https://www.linuxidc.com/Linux/2014-06/102687.htm ,
oracle方面的一些知识也可以参考我之前的一篇博客: https://blog.csdn.net/u014427391/article/details/82317376

Oracle 递归查询 (start with ...connect by ...prior)

1、connect by 是结构化查询中用到的,其基本语法是:
select … from tablename

start with 条件1
connect by 条件2
where 条件3;

例:
select * from table
start with org_id = ‘HBHqfWGWPy’
connect by prior org_id = parent_id;
 
 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:
org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。
        用上述语法的查询可以取得这棵树的所有记录。
        其中:
        条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。
        条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id;就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。例子中表示:从org_id的值为HBHqfWGWPy的这条记录开始查询,将该条记录的org_id 等于即将查询记录的 parent_id的所有记录查询出来,即查询org_id的值为HBHqfWGWPy这条记录的所有子节点。
        条件3 是过滤条件,用于对返回的所有记录进行过滤。
2.关于PRIOR
        运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。
        PRIOR被置于CONNECT BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如:
         CONNECT BY PRIOR EMPNO=MGR
         PIROR运算符被置于CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。
例如:
         CONNECT BY EMPNO=PRIOR MGR
         在这种方式中也应指定一个开始的节点。


















以上是关于Oracle递归查询start with connect by prior的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 递归查询 (start with ...connect by ...prior)

Oracle高级函数篇之递归查询start with connect by prior简单用法

Oracle递归查询start with connect by prior

oracle树形查询 start with connect by

sql语句递归查询(start with)

oracle 中start with 的用法