zoukankan      html  css  js  c++  java
  • oracle中的层级递归查询操作

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


    select [level], column, expr... 
    from table
    [where condition]
    start with condition
    connect 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   

    上面语句查询结果:

    1	1	厦门教育局
    2	2	福建省教育厅
    3	3	中华人民共和国教育部
    

    从上面两个查询结果很容易理解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   ;


                 查询结果

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


    • 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

                查询结果

    1	1		        <厦门教育局	
    2	2	厦门教育局	<厦门教育局<思明区教育局	叶节点
    3	2	厦门教育局	<厦门教育局<湖里区教育局	叶节点
    4	2	厦门教育局	<厦门教育局<海沧区教育局	叶节点
    5	2	厦门教育局	<厦门教育局<集美区教育局	叶节点
    6	2	厦门教育局	<厦门教育局<翔安区教育局	叶节点
    7	2	厦门教育局	<厦门教育局<同安区教育局	叶节点
    
    • 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达到我们想要的既按照层级排序,又按照字段排序







  • 相关阅读:
    .net学习笔记----WebConfig常用配置节点介绍
    .net学习笔记----会话状态Session
    .net学习笔记---HttpRuntime类
    最优化基础(三)
    最优化基础(二)
    最优化基础(一)
    非精确线搜索
    精确线搜索——抛物线法
    Matlab自定义函数的几种方法
    精确线搜索-黄金分割法
  • 原文地址:https://www.cnblogs.com/wala-wo/p/5119293.html
Copyright © 2011-2022 走看看