如果表中存在层次数据,则可以使用层次化查询子句查询出表中行记录之间的层次关系
基本语法:
  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. [Qt]自定义表头实现过滤功能

    1. 写在前面 过滤功能源自项目上交互优化用户体验,在表头添加过滤符号实现过滤,替换以往在表格上方占用一行过滤项进行过滤. 2. 过滤提示 过滤提示就是三态图标(normal,hover,press) ...

  2. Spring Boot2(九):整合Jpa的基本使用

    一.前言 今天早上看到一篇微信文章,说的是国内普遍用的Mybatis,而国外确普遍用的是Jpa.我之前也看了jpa,发现入门相当容易.jpa对于简单的CRUD支持非常好,开发效率也会比Mybatis高 ...

  3. golang开发:类库篇(二) Redis连接池的使用

    为什么要使用连接池 一个数据库服务器只拥有有限的连接资源,一旦所有的连接资源都在使用,那么其它需要连接的资源就只能等待释放连接资源.所以,在连接资源有限的情况下,提高单位时间的连接的使用效率,缩短连接 ...

  4. 我是这么学习Selenium元素定位操作的

    写在前面 做web自动化测试都有体会,本质也就是通过操作页面元素对象来模拟用户操作行为,那么首先我们先找到这些元素对象,然后才能进行一系列操作. 我们得先告诉自动化工具或者说代码要操作那个元素,毕竟代 ...

  5. Windows使用Python统一设置解析器路径

    碰到的问题: .py文件放在cgi-bin文件夹下面,这个.py文件都要设置"#!python.exe路径"来告诉CGI如何找解析器解析这个.py的文件,我是想知道这个路径可否统一 ...

  6. 成功入职ByteDance,分享我的八面面经心得!

    今天正式入职了字节跳动.办公环境也很好,这边一栋楼都是办公区域.公司内部配备各种小零食.饮料,还有免费的咖啡.15楼还有健身房.而且公司包三餐来着.下午三点半左右还会有阿姨推着小车给大家送下午茶.听说 ...

  7. 使用java的MultipartFile实现layui官网文件上传实现全部示例,java文件上传

    layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用. layui文件上传示例地址:https://www. ...

  8. C语言指针使用不当带来的内存不可读

    前几天遇到一个C语言初学者提到的一个问题,代码我做了一些修改,如下: #include <stdio.h> #include <string.h> int main(void) ...

  9. 小代学Spring Boot之集成MyBatis

    想要获取更多文章可以访问我的博客 - 代码无止境. 上一篇小代同学在Spring Boot项目中配置了数据源,但是通常来讲我们访问数据库都会通过一个ORM框架,很少会直接使用JDBC来执行数据库操作的 ...

  10. js 使用ES6 实现从json中取值并返回新的数组或者字符串

    1.获取的json数据是这样的: data:[ { 'Id': '1', 'Phone': '123456', 'Name': '张三', }, { 'Id': '2', 'Phone': '7894 ...