如果表中存在层次数据,则可以使用层次化查询子句查询出表中行记录之间的层次关系
基本语法:
  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. JS的第一天,精彩内容

    1.JS 介绍 js的全称是JavaScript,它是一门前台语言 Java是一门后台语言 ,它们两个之间毫无关系 JavaScript的作者是布兰登,艾奇 前台语言:运行在客户端 后台语言:与数据库 ...

  2. 关于java中构造方法、实例初始化、静态初始化执行顺序

    在Java笔试中,构造方法.实例初始化.静态初始化执行顺序,是一个经常被考察的知识点. 像下面的这道题(刚刚刷题做到,虽然做对了,但是还是想整理一下) 运行下面的代码,输出的结果是... class ...

  3. 从无到有构建vue实战项目(三)

    四.响应式布局的实现 elemnt-ui参考bootatrap提供了响应式布局,附上地址:https://element.eleme.cn/#/zh-CN/component/layout 以下是我的 ...

  4. JDK1.8集合之HashMap

    目录 简介 内部实现 类的属性 Node数组 重要方法 put()和putVal()方法 get()和getNode()方法 resize()方法 容量设置为2的幂的优点 计算Hash时候 扩容时候 ...

  5. NEUOJ 1702:撩妹全靠魅力值(CDQ分治三维偏序)

    http://acm.neu.edu.cn/hustoj/problem.php?id=1702 思路:三维偏序模板题,用CDQ分治+树状数组或者树套树.对于三元组(x,y,z),先对x进行排序,然后 ...

  6. SpringBoot系列——CORS(跨源资源共享)

    前言 出于安全原因,浏览器禁止ajax调用当前源之外的资源(同源策略),我们之前也有写个几种跨域的简单实现(还在问跨域?本文记录js跨域的多种实现实例),本文主要详细介绍CORS,跨源资源共享,以及如 ...

  7. 测试调试-利用fiddler修改response返回结果

    测试前端过程中,经常需要验证各种功能状态.不同数据层级等返回后的展示效果.一般会通过以下三种方式进行测试: 1.构造满足条件的测试数据:(耗时费力) 2.修改数据库:(前提需要了解数据库数据存储.沟通 ...

  8. Spring Boot2(十二):手摸手教你搭建Shiro安全框架

    一.前言 SpringBoot+Shiro+Mybatis完成的. 之前看了一位小伙伴的Shiro教程,跟着做了,遇到蛮多坑的(´இ皿இ`) 修改整理了一下,成功跑起来了.可以通过postman进行测 ...

  9. C语言学习书籍推荐《C语言接口与实现:创建可重用软件的技术》下载

    <C语言接口与实现:创建可重用软件的技术>概念清晰.实例详尽,是一本有关设计.实现和有效使用C语言库函数,掌握创建可重用C语言软件模块技术的参考指南.书中提供了大量实例,重在阐述如何用一种 ...

  10. 自己实现IOC容器,java代码实现简易版IOC容器,IOC容器实现的步骤分解

    一.需求 实现一个简易的IOC容器,管理Bean,从IOC容器的BeanFactory中获取实例,从而取代自己new实例的做法. 二.实现步骤分析 三.具体代码实现 自定义注解类 MyComponen ...