如果表中存在层次数据,则可以使用层次化查询子句查询出表中行记录之间的层次关系
基本语法:
  START WITH <condition1> CONNECT BY [ NOCYCLE ] <condition2>
  注: [ NOCYCLE ]参数暂时不解释
例:

SQL> select empno, ename, job, mgr, hiredate, sal, comm, deptno, level as lv from emp
2 start with empno = 7839 connect by (prior empno) = mgr;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO LV
----- ---------- ------------------------------ ----- ----------- --------- --------- ------ ----------
7839 KING PRESIDENT 1981-11-17 5000.25 10 1
7566 JONES MANAGER 7839 1981-04-02 2975.25 20 2
7788 SCOTT ANALYST 7566 1982-12-09 3000.25 20 3
7876 ADAMS CLERK 7788 1983-01-12 1100.25 20 4
7902 FORD ANALYST 7566 1981-12-03 3000.25 20 3
7369 SMITH CLERK 7902 1980-12-17 800.25 20 4
7698 BLAKE MANAGER 7839 1981-05-01 2850.25 30 2
120 gxl SALESMAN 7698 2018-02-08 5500.25 300.00 10 3
7499 ALLEN SALESMAN 7698 1981-02-20 1600.25 300.00 30 3
7521 WARD SALESMAN 7698 1981-02-22 1250.25 500.00 30 3
7654 MARTIN SALESMAN 7698 1981-09-28 1250.25 1400.00 30 3
7844 TURNER SALESMAN 7698 1981-09-08 1500.25 0.00 30 3
7900 JAMES CLERK 7698 1981-12-03 950.25 30 3
7782 CLARK MANAGER 7839 1981-06-09 2450.25 10 2
7934 MILLER CLERK 7782 1982-01-23 1300.25 10 3
15 rows selected

表中存在层次数据
数据之间的层次关系即父子关系,通过表中列与列间的关系来描述,如EMP表中的EMPNO和MGR。EMPNO表示雇员编号,MGR表示领导
该雇员的人的编号,在表的每一行中都有一个表示父节点的MGR(除根节点外),通过每个节点的父节点,就可以确定整个树结构。
    
CONNECT BY [ NOCYCLE ] CONDITION2 层次子句作用
CONDITION2 [PRIOR expr = expr] : 指定层次结构中父节点与子节点之之间的关系。
CONDITION2 中的 一元运算符 PRIORY 必须放置在连接关系的两列中某一个的前面。在连接关系中,除了可以使用列名外,还允许使用列表达式。

1.START WITH
start with 子句为可选项,用来标识哪行作为查找树型结构的第一行(即根节点,可指定多个根节点)。若该子句被省略,则表示所有满足查询条件的行作为根节点。
2.关于PRIOR
PRIOR 置于运算符前后的位置,决定着查询时的检索顺序。
 
2.1 从根节点自顶向下
SQL> select empno, ename, mgr, level as lv from emp start with mgr is null
2 connect by (prior empno) = mgr order by level;
EMPNO ENAME MGR LV
----- ---------- ----- ----------
7839 KING 1
7566 JONES 7839 2
7782 CLARK 7839 2
7698 BLAKE 7839 2
7902 FORD 7566 3
7521 WARD 7698 3
7788 SCOTT 7566 3
7900 JAMES 7698 3
120 gxl 7698 3
7499 ALLEN 7698 3
7934 MILLER 7782 3
7654 MARTIN 7698 3
7844 TURNER 7698 3
7876 ADAMS 7788 4
7369 SMITH 7902 4
15 rows selected

----分析
层次查询执行逻辑:
a. 确定上一行(相对于步骤b中的当前行),若start with 子句存在,则以该语句确定的行为上一行,若不存在则将所有的数据行视为上一行。
b. 从上一行出发,扫描除该行之外所有数据行。
c. 匹配条件 (prior empno) = mgr,注意 一元运算符 prior,意思是之前的,指上一行
当前行定义:步骤b中扫描得到的所有行中的某一行
匹配条件含义:当前行字段 mgr 的值等于上一行字段 empno中的值,若满足则取出该行,并将level + 1,
匹配完所有行记录后,将满足条件的行作为上一行,执行步骤 b,c。直到所有行匹配结束.

 
2.2 从根节点自底向上
SQL> select empno, ename, mgr, level as lv from emp start with empno = 7876
2 connect by (prior mgr ) = empno order by level;
EMPNO ENAME MGR LV
----- ---------- ----- ----------
7876 ADAMS 7788 1
7788 SCOTT 7566 2
7566 JONES 7839 3
7839 KING 4

--分析
层次查询执行逻辑:
a .确定上一行(相对于步骤b中的当前行),若start with 子句存在,则以该语句确定的行为上一行,若不存在则将所有的数据行视为上一行。
b .从上一行出发,扫描除该行之外所有数据行。
c .匹配条件 (prior mgr ) = empno
注意 一元运算符 prior,意思是之前的,指上一行
当前行定义:步骤b中扫描得到的所有行中的某一行
匹配条件含义:当前行字段 empno 的值等于上一行字段 mgr 中的值,若满足则取出该行,并将
level + 1,
匹配完所有行记录后,将满足条件的行作为上一行,执行步骤 b,c。直到所有行匹配结束.

一、基本语法

SELECT * FROM TABLE START WITH <condition1> CONNECT BY [PRIOR] id= parentid;

层次查询(递归查询)用来查找存在父子关系的数据,也就是树形结构的数据;其返还的数据也能够明确的区分出每一层的数据。

"start  with <condition>"  --  代表在这棵树中你要开始遍历的的节点,是用来限制第一层的数据,或者叫根节点数据;以这部分数据

            为基础来查找第二层数据,然后以第二层数据查找第三层数据以此类推。

"connect  by  prior id = parentid"  --  标示节点之间的父子关系,是用来指明Oracle在查找数据时以怎样的一种关系去查找;比如说查

               找第二层的数据时用第一层数据的id去跟表里面记录的parentid字段进行匹配,如果这个条件成立

                那么查找出来的数据就是第二层数据,同理查找第三层第四层…等等都是按这样去匹配。

"level" -- 关键字,代表树形结构中的层级编号;第一层是数字1,第二层数字2,依次递增。

prior还有一种用法:

select * from table [start with condition1] connect by id= [prior] parentid
或者:
select * from table [start with condition1] connect by [prior] parentid = id

二、分层查询的例子

1.从根节点查找叶子节点,即从根节点自顶向下

SQL> select level rn , empno,mgr,substr(sys_connect_by_path(ename,'-->'),4) from emp
2 start with ename = 'KING' connect by prior empno = mgr;
RN EMPNO MGR SUBSTR(SYS_CONNECT_BY_PATH(ENA
---------- ----- ----- --------------------------------------------------------------------------------
1 7839 KING
2 7566 7839 KING-->JONES
3 7788 7566 KING-->JONES-->SCOTT
4 7876 7788 KING-->JONES-->SCOTT-->ADAMS
3 7902 7566 KING-->JONES-->FORD
4 7369 7902 KING-->JONES-->FORD-->SMITH
2 7698 7839 KING-->BLAKE
3 120 7698 KING-->BLAKE-->gxl
3 7499 7698 KING-->BLAKE-->ALLEN
3 7521 7698 KING-->BLAKE-->WARD
3 7654 7698 KING-->BLAKE-->MARTIN
3 7844 7698 KING-->BLAKE-->TURNER
3 7900 7698 KING-->BLAKE-->JAMES
2 7782 7839 KING-->CLARK
3 7934 7782 KING-->CLARK-->MILLER
15 rows selected

2.从叶子节点查找上层节点

SQL> select level rn , empno, mgr, substr(sys_connect_by_path(ename,'-->'),4) tb from emp
2 start with ename = 'ADAMS' connect by prior mgr = empno;
RN EMPNO MGR TB
---------- ----- ----- --------------------------------------------------------------------------------
1 7876 7788 ADAMS
2 7788 7566 ADAMS-->SCOTT
3 7566 7839 ADAMS-->SCOTT-->JONES
4 7839 ADAMS-->SCOTT-->JONES-->KING

 三、sys_connect_by_path 递归函数

SYS_CONNECT_BY_PATH( cln, fmt )  :这个函数是oracle9i才新提出来的!它一定要和connect by子句合用!

        第一个参数cln是形成树形式的字段,第二个参数fmt是父级和其子级分隔显示用的分隔符,

        CONNECT BY PRIOR 是标示父子关系的对应!

SQL> SELECT level,empno,mgr,SYS_CONNECT_BY_PATH(ename, '>') pt
2 FROM emp START WITH ename = 'KING' CONNECT BY PRIOR empno = mgr;
LEVEL EMPNO MGR PT
---------- ----- ----- --------------------------------------------------------------------------------
1 7839 >KING
2 7566 7839 >KING>JONES
3 7788 7566 >KING>JONES>SCOTT
4 7876 7788 >KING>JONES>SCOTT>ADAMS
3 7902 7566 >KING>JONES>FORD
4 7369 7902 >KING>JONES>FORD>SMITH
2 7698 7839 >KING>BLAKE
3 120 7698 >KING>BLAKE>gxl
3 7499 7698 >KING>BLAKE>ALLEN
3 7521 7698 >KING>BLAKE>WARD
3 7654 7698 >KING>BLAKE>MARTIN
3 7844 7698 >KING>BLAKE>TURNER
3 7900 7698 >KING>BLAKE>JAMES
2 7782 7839 >KING>CLARK
3 7934 7782 >KING>CLARK>MILLER
15 rows selected

ORACLE 的CONNECT BY、START WITH,CONNECT_BY_ROOT、CONNECT_BY_ISLEAF、SYS_CONNECT_BY_PATH,LEVEL的使用(Hierarchical query-层次查询)的更多相关文章

  1. .Net程序员学用Oracle系列(20):层次查询(CONNECT BY)

    1.层次查询语句 1.1.CONNECT BY 语法 1.2.CONNECT BY 示例 2.层次查询函数 2.1.SYS_CONNECT_BY_PATH 2.2.WMSYS.WM_CONCAT 2. ...

  2. oracle使用connect by进行级联查询 树型菜单

    Oracle使用connect by进行级联查询 树型菜单(转) connect by可以用于级联查询,常用于对具有树状结构的记录查询某一节点的所有子孙节点或所有祖辈节点. 来看一个示例,现假设我们拥 ...

  3. Oracle 层次查询 connect by

      oracle 层次查询 语法:       SELECT ... FROM            [WHERE condition]                             --过 ...

  4. Oracle递归查询connect by

    一.概述 Oracle中可以通过START WITH . . . CONNECT BY . . .子句来实现SQL的层次查询. 自从Oracle 9i开始,可以通过 SYS_CONNECT_BY_PA ...

  5. Oracle的Connect By理解

    connect by中的条件就表示了父子之间的连接关系 比如 connect by id=prior pid,但如果connect by中的条件没有表示记录之间的父子关系那会出现什么情况? 常见的,c ...

  6. ORACLE中CONNECT BY...START WITH...的使用

    源: https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm http://www.cnblogs.com/baiy ...

  7. oracle中 connect by prior 递归算法 -- 理解

    oracle中 connect by prior 递归算法 -- 理解 http://blog.163.com/xxciof/blog/static/7978132720095193113752/  ...

  8. 12C 连接方式和 Oracle Easy Connect Naming method

    1.12C 连接方式 PDB is not an instance, so using SID in the connection string will not work. When the dat ...

  9. oracle中connect by语句的优化

    很多应用中都会有类似组织机构的表,组织机构的表又通常是典型的层次结构(没有循环节点).于是通过组织控制数据权限的时候,许多人都喜欢通过connect by获得组织信息,然后再过滤目标数据. 在有些情况 ...

随机推荐

  1. HDU 5113:Black And White(DFS)

    题目链接 题意 给出一个n*m的图,现在有k种颜色让你对这个图每个格子染色,每种颜色最多可以使用col[i]次,问是否存在一种染色方案使得相邻格子的颜色不同. 思路 以为是构造题,结果是爆搜.对于每一 ...

  2. 大规模SDN云计算数据中心组网的架构设计

    本文首先分析了在大规模SDN数据中心组网中遇到的问题.一方面Underlay底层组网规模受限于设备实际的转发能力和端口密度,单一Spine-leaf的Fabric架构无法满足大规模组网的需求:另一方面 ...

  3. redis 文件事件模型

    参考文献: 深入剖析 redis 事件驱动 Redis 中的事件循环 深入了解epoll (转) Redis自己的事件模型 ae EPOLL(7) Linux IO模式及 select.poll.ep ...

  4. 微信小程序社区爬取

    # CrawlSpider 需要使用:规则提取器 和 解析器 # 1. allow设置规则的方法:要能够限制在目标url上面, 不要跟其他的url产生相同的正则即可 # 2. 什么情况下使用follo ...

  5. Larave使用composer安装无反应,提示“Changed current directory to C:/Users/Administrator/AppData/Roaming/Composer”

    按照Laravel文档的安装方式在windows上安装Laravel时,执行composer global require "laravel/installer". 然后命令行就显 ...

  6. ZigBee按键查询实践

    按键查询 即硬件上电后,程序开始运行,当检测到按键按下,触发按键语句,执行按键触发的事件: 玩单片机需要清楚两件东西,第一个是单片机的电路图,另一个则是单片机的寄存器: CC2530是51的升级版,我 ...

  7. Java学习笔记之---比较接口与抽象类

    Java学习笔记之---比较接口与抽象类 抽象类是描述事物的本质,接口是描述事物的功能 接口与抽象类的异同 1.一个类只能继承一个父类,但是可以有多个接口 2.抽象类中的抽象方法没有方法体,但是可以有 ...

  8. 查询亿级数据毫秒级返回!Elasticsearch 是如何做到的?

    掌握搜索技能,才能在庞大的数据集中找到准确的目标.本篇就带你进入另一个非凡的旅程,即使你没有像Google或Baidu一样强大的技术,一样也可以做出与之相匹敌的用户体验. 搜索是现代软件必备的一项基础 ...

  9. Skyline WEB端开发2——添加一个定位点、文本标签

    Skyline 添加定位点 sgworld.Creator.CreatePosition CreatePosition( X, //兴趣点的东西方向坐标,即经度 Y, //兴趣点的南北方向坐标,即纬度 ...

  10. android网络编程-socket基础

    转载http://www.eoeandroid.com/thread-61727-1-1.html 一.Socket通讯机制1. TCP连接: 面向连接的可靠传输协议,具有数据确认和数据重传机制,保证 ...