oracle中的层级递归查询操作

来源:互联网 发布:nba stat数据 编辑:程序博客网 时间:2024/05/21 18:25

oracle中的层级操作非常方便,在使用之后爱不释手,以前要实现该种数据查询操作,需要非常复杂的实现过程。在oracle中通过connect by可以实现前面的目的,通常情况下层级查询基本都能实现递归查询目的。下面是connect by的使用语法:


select [level], column, expr... from table[where condition]start with conditionconnect by [prior nodeCode1 = nodeCode2 | nodeCode1 = prior nodeCode2];

level :层级数,是个伪列。

start with :起始记录条件,是层级查询必要条件,支持支查询操作 。

connect by :表达层级关系,通过priore表示父层级/子层级,不支持子查询操作。

priore 关键字说明:

  • priore 在nodeCode1 前面表示 层级查询,priore在表示以start with 作为第一级,并查询该层级以下的所有层级。
  • priore 在nodeCode2前面表示以start with 作为第一级,并查询该层级以上的所有层级。

/*prior在等号前面查询*/

    select *             from ORGANIZE             where ORGTYPE = 1             start with code = '3502030039'             Connect By Prior  code =  PARENTCODE   

上面语句查询结果:

1厦门教育局2思明区教育局3湖里区教育局4海沧区教育局5集美区教育局6翔安区教育局7同安区教育局

/*prior在等号后面查询*/

    select *             from ORGANIZE             where ORGTYPE = 1             start with code = '3502030039'             Connect By code =  Prior PARENTCODE   

上面语句查询结果:

11厦门教育局22福建省教育厅33中华人民共和国教育部

从上面两个查询结果很容易理解prior位置变化的作用。


oracle 其他层级操作函数

  • SYS_CONNECT_BY_PATH() 函数实现层级节点合并拼接操作

            select level,ORGNAME,sys_connect_by_path(ORGNAME,'>') [合并层级], prior ORGNAME [父节点]            from ORGANIZE                     where ORGTYPE = 1                     start with code = '3502030039'                     Connect By Prior  code =  PARENTCODE   ;

             查询结果
11厦门教育局>厦门教育局22思明区教育局>厦门教育局>思明区教育局厦门教育局32湖里区教育局>厦门教育局>湖里区教育局厦门教育局42海沧区教育局>厦门教育局>海沧区教育局厦门教育局52集美区教育局>厦门教育局>集美区教育局厦门教育局62翔安区教育局>厦门教育局>翔安区教育局厦门教育局72同安区教育局>厦门教育局>同安区教育局厦门教育局


  • CONNECT_BY_ISLEAF特性

             CONNECT_BY_ISLEAF特性可以用来判断该层级是否为叶节点,1表示叶节点.

           select level,prior  ORGNAME,sys_connect_by_path(ORGNAME,'<'),decode(connect_by_isleaf, 1,'叶节点', null) "节点类型"            from ORGANIZE                    where ORGTYPE = 1                    start with code = '3502030039'                    Connect By Prior  code =  PARENTCODE
            查询结果

11        <厦门教育局22厦门教育局<厦门教育局<思明区教育局叶节点32厦门教育局<厦门教育局<湖里区教育局叶节点42厦门教育局<厦门教育局<海沧区教育局叶节点52厦门教育局<厦门教育局<集美区教育局叶节点62厦门教育局<厦门教育局<翔安区教育局叶节点72厦门教育局<厦门教育局<同安区教育局叶节点

  • CONNECT_BY_ROOT

              CONNECT_BY_ROOT可用于读取根节点

            select                 level,ORGNAME ,prior  ORGNAME "父节点",                sys_connect_by_path(ORGNAME,'<') "节点合并",                decode(connect_by_isleaf, 1,'叶节点', null) "节点类型" ,                connect_by_root  ORGNAME "根节点"            from ORGANIZE                     where ORGTYPE = 1                     start with code = '3502030039'                     Connect By Prior  code =  PARENTCODE    
               查询结果

LEVEL    ORGNAME       父节点                节点合并         节点类型    根节点1    厦门教育局        <厦门教育局        厦门教育局2    思明区教育局    厦门教育局    <厦门教育局<思明区教育局    叶节点    厦门教育局2    湖里区教育局    厦门教育局    <厦门教育局<湖里区教育局    叶节点    厦门教育局2    海沧区教育局    厦门教育局    <厦门教育局<海沧区教育局    叶节点    厦门教育局2    集美区教育局    厦门教育局    <厦门教育局<集美区教育局    叶节点    厦门教育局2    翔安区教育局    厦门教育局    <厦门教育局<翔安区教育局    叶节点    厦门教育局2    同安区教育局    厦门教育局    <厦门教育局<同安区教育局    叶节点    厦门教育局

  •   order  siblings  by

               oracle中的层级查询结果直接使用orader by 进行排序无法得到我们想要的结果,但可以通过order  siblings  by达到我们想要的既按照层级排序,又按照字段排序







原创粉丝点击