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. 外包如何安排人手-b

    前几天跟一位做人事的朋友聊天,说起软件行业人员问题.朋友的公司是做软件外包的.一个APP项目基本配置6-7个人,每个Android.ios.后台都各配2人以上,但是项目各种超期.各种无法交付.各种客户 ...

  2. 【转载】HRTF音频3D定位技术综述

    1. 序 您一定有过这样的经验:在一个炎热的夏夜,讨厌的蚊子在你的耳边飞舞.此时,没有比除掉这个祸害更急所的了,对吧?做到这一点,不必睁大了眼去找蚊子,只需依靠敏锐的听力,一样可以确定蚊子的方位,在漆 ...

  3. C#与C++的几个不同之处知识点

    1.索引器 索引器是C#自创的内容,这是C++当中没有的内容,所以做一次笔记. 索引器是用于书写一个可以通过使用[]想数组一样直接访问集合元素的方法.我们只需要指定待访问实例或元素的索引.索引器的语法 ...

  4. 随着visual studio 2013 发布.带来的一些变化

    1.asp.net a.在2013中, asp.net走向了统一.使用不同的asp.net 框架搭(web forms ,api, mvc )建混合应用 b.身份验证 无身份验证 个人用户账户 (窗体 ...

  5. The type java.lang.String cannot be resolved. It is indirectly referenced from required .class files

    最近在做J2ME开发项目,配置环境一切OK,但是打开项目时某些文件提示: The type java.lang.String cannot be resolved. It is indirectly ...

  6. 当一个控件属性不存在的时候,IDE会出错在这里

    procedure TWinControl.ReadState(Reader: TReader); begin DisableAlign; try inherited ReadState(Reader ...

  7. HashMap循环遍历方式及其性能对比

    主要介绍HashMap的四种循环遍历方式,各种方式的性能测试对比,根据HashMap的源码实现分析性能结果,总结结论.   1. Map的四种遍历方式 下面只是简单介绍各种遍历示例(以HashMap为 ...

  8. 【转】git在eclipse中的配置

    原文网址:http://www.cnblogs.com/zhxiaomiao/archive/2013/05/16/3081148.html 一_安装EGIT插件 http://download.ec ...

  9. autoit使用

    autoit下载地址: http://www.autoitx.com/thread-12964-1-1.html?sid=4zMMSb 在autoit的安装目录下有个Au3Info.exe文件,该文件 ...

  10. 装饰模式,制作一个蛋糕java

    import java.text.DecimalFormat; //抽象组件组件 interface mkcake { public void cake(); } class Cake impleme ...