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达到我们想要的既按照层级排序,又按照字段排序

oracle中的层级递归查询操作的更多相关文章

  1. oracle 中proc和oci操作对缓存不同处理

    oracle 中proc和oci操作对缓存不同处理

  2. 对oracle中date/timestamp的操作

    设置oracle中date的会话格式为 'yyyy-mm-dd hh24:mi:ss' alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss ...

  3. Oracle中日期时间的操作比较和加减-入门基础(转)

    Oracle关于时间/日期的操作     1.日期时间间隔操作 当前时间减去7分钟的时间 select sysdate,sysdate - interval '7' MINUTE from dual ...

  4. oracle中有关表的操作

    在Oracle中查看所有的表: select * from tab/dba_tables/dba_objects/cat; 看用户建立的表 : select table_name from user_ ...

  5. Oracle中快速查询和操作某个用户下的所有表数据信息

    一.禁止所有的外键约束 在pl/sql developer下执行如下语句:SELECT 'ALTER TABLE ' || table_name || ' disable CONSTRAINT ' | ...

  6. Oracle中字段的修改操作语法

      对字段操作 操作方法 更新字段名 alter table TABLE_NAME rename column column_old to column_new; 添加字段 alter table T ...

  7. Oracle “CONNECT BY” (层级递归查询)

    Oracle “CONNECT BY”是层次查询子句,一般用于树状或者层次结果集的查询.其语法是: ? 1 2 [ START WITH condition ] CONNECT BY [ NOCYCL ...

  8. ORACLE中用户等系统信息操作

    1.查看所有用户:select * from dba_users;   select * from all_users;   select * from user_users; 2.查看用户或角色系统 ...

  9. oracle 中关于null的操作

    空值 空值一般用NULL表示 一般表示未知的.不确定的值,也不是空格 一般运算符与其进行运算时,都会为空 空不与任何值相等 表示某个列为空用:IS NULL  不能使用COMM=NULL这种形式 某个 ...

随机推荐

  1. C#转义字符总结

    转义字符 \·一种特殊的字符常量:·以反斜线"\"开头,后跟一个或几个字符.·具有特定的含义,不同于字符原有的意义,故称“转义”字符.·主要用来表示那些用一般字符不便于表示的控制代 ...

  2. tyvj 1150 绳子围点 Pick定理 防溢出策略

    P1150 - 绳子围点 From 332404521    Normal (OI)总时限:10s    内存限制:128MB    代码长度限制:64KB 背景 Background 最近小小鱼在研 ...

  3. BZOJ 3676 回文串

    Description 考虑一个只包含小写拉丁字母的字符串\(s\).我们定义\(s\)的一个子串\(t\)的"出现值"为\(t\)在\(s\)中的出现次数乘以\(t\)的长度.请 ...

  4. html5--indexedDB

    http://www.cnblogs.com/Johnny_Z/archive/2012/11/04/2753331.html http://database.51cto.com/art/201202 ...

  5. windows 版Tomcat 7.0的配置

    http://hi.baidu.com/liguohei/item/d6ea23ff904f98753d198b24 测试成功,截图 ~~~~~~~~~~~~~~~ 一.安装JDK 1.7 1.添加环 ...

  6. ssh 认证指定端口

    [root@database2 ~]# cat ssh.sh if [ ! $# -eq 2 ] ;then echo "请输入用户密码以空格分开" exit else ssh-k ...

  7. 进程创建函数fork()、vfork() ,以及excel()函数

    一.进程的创建步骤以及创建函数的介绍 1.使用fork()或者vfork()函数创建新的进程 2.条用exec函数族修改创建的进程.使用fork()创建出来的进程是当前进程的完全复制,然而我们创建进程 ...

  8. CSU 1507 超大型LED显示屏 第十届湖南省赛题

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1507 解题思路:这是一道模拟题,看了那么多人的代码,我觉得我的代码是最简的,哈哈,其实就 ...

  9. 冒泡排序原理(BubbleSorted)

    //简单的冒泡排序public class BubbleMath { public static void main(String[] args) { //分清楚数组的头和尾,开始为尾,最后为头,因为 ...

  10. if form1.showmodal:=mrok then 什么意思

    if form1.showmodal:=mrok then 这句话什么意思? 最佳答案 这个问题说来话长,且听我慢慢道来... 首先,你仔细看一看,所有的命令按钮(不论是Button还是BitBtn) ...