oracle树状询,Oracle层级询语句connect by 用法详解

如果表中包含层级数据,那么你就可以使用层级查询从句选择行层级顺序。

1.层级查询从句语法

层级查询从句语法:

{ CONNECT BY [ NOCYCLE ] condition [AND condition]... [ START WITH condition ]

| START WITH condition CONNECT BY [ NOCYCLE ] condition [AND condition]...

}

START WITH:指定层级的跟节点行。

CONNECT BY:指定层级的父行于子行的关系。

NOCYCLE参数指示Oracle数据库查询返回行,即使CONNECT BY在数据中存在循环。通常与CONNECT_BY_ISCYCLE伪列一起使用查看行是否包含循环。

在层级查询中,表达式的条件必须使用PRIOR运算符加以限定来查询父行,例如:

... PRIOR expr = expr

or

... expr = PRIOR expr

如果CONNECT BY的条件是复合条件,只有一个条件PRIOR运算符是必须的,然而可以有多个PRIOR条件。例如:

CONNECT BY last_name != 'King' AND PRIOR employee_id = manager_id ...

CONNECT BY PRIOR employee_id = manager_id and

PRIOR account_mgr_id = customer_id ...

PRIOR是一个一元运算符和一元+-算术运算符具有相同的优先级。PRIOR根据层级查询中的表达式立刻计算出当前行的父行。

PRIOR必须与比较列值的相等运算符一起使用(PRIOD关键字可以相等运算符的任意一边)。

CONNECT BY条件和PRIOD表达两者之间形成一个不相关的子查询结构。因此CURRVAL和NEXTVAL是无效的PRIOR表达式,所以PRIOR表达不能用于查询序列。

通过使用CONNECT_BY_ROOT运算符来限定在查询列表中的列,可以进一步细化层级查询。这个运算符扩展了层级查询CONNECT BY [PRIOR]条件的功能,不仅立即返回父行,而且还返回层次结构中的所有行根节点行。

2.层级查询伪列

层级查询伪列只有在层级查询中是有效的,层级查询伪列:

2.1.CONNECT_BY_ISCYCLE伪列

如果当前行有一个子行,且子行又是当前行的祖先行,CONNECT_BY_ISCYCLE返回1,否则返回0.

只有在CONNECT BY从句中指定了NOCYCLE参数,才能指定CONNECT_BY_ISCYCLE。由于CONNECT BY存在循环数据,NOCYCLE能使Oracle返回查询结果,否则将查询失败。

2.2.CONNECT_BY_ISLEAF伪列

如果当前行是CONNECT BY条件定义树的叶子节点,CONNECT_BY_ISLEAF伪列返回1,否则返回0。该信息也表明了一个给定的行是否可以进一步扩张,表现出更多的层次。

2.3.LEVEL伪列

层级查询返回的每一行,跟节点行LEVEL伪列返回1,跟节点的子节点行LEVEL为例返回2等等。跟节点行是倒置树的最高行。子节点行是任意非跟节点行。父节点行是任意有子节点的行。叶子节点行是任意没有子节点行。

5cc3a79cae078d076fe8b127b658c753.gif

3.EXAMPLES

3.1.CONNECT BY Example

查询所有员工的上级。

SQL> select e.empno, e.ename, e.mgr from emp e connect by prior e.empno = e.mgr;

EMPNO ENAME        MGR

----- ---------- -----

7788 SCOTT       7566

7876 ADAMS       7788

7902 FORD        7566

7369 SMITH       7902

7499 ALLEN       7698

7900 JAMES       7698

7844 TURNER      7698

7654 MARTIN      7698

7521 WARD        7698

7934 MILLER      7782

7876 ADAMS       7788

7566 JONES       7839

7788 SCOTT       7566

7876 ADAMS       7788

7902 FORD        7566

7369 SMITH       7902

........

3.2.LEVEL Example

使用level虚列显示父行于子行的层级

SQL> select e.empno, e.ename, e.mgr,level from emp e connect by prior e.empno = e.mgr;

EMPNO ENAME        MGR      LEVEL

----- ---------- ----- ----------

7788 SCOTT       7566          1

7876 ADAMS       7788          2

7902 FORD        7566          1

7369 SMITH       7902          2

7499 ALLEN       7698          1

7900 JAMES       7698          1

7844 TURNER      7698          1

7654 MARTIN      7698          1

7521 WARD        7698          1

7934 MILLER      7782          1

7876 ADAMS       7788          1

7566 JONES       7839          1

7788 SCOTT       7566          2

7876 ADAMS       7788          3

7902 FORD        7566          2

7369 SMITH       7902          3

............

3.3.START WITH Examples

从员工KING开始,查询出所有员工的上级

SQL> select e.empno, e.ename, e.mgr, level

2    from emp e

3  connect by prior e.empno = e.mgr

4   start with e.ename = 'KING';

EMPNO ENAME        MGR      LEVEL

----- ---------- ----- ----------

7839 KING                      1

7566 JONES       7839          2

7788 SCOTT       7566          3

7876 ADAMS       7788          4

7902 FORD        7566          3

7369 SMITH       7902          4

7698 BLAKE       7839          2

7499 ALLEN       7698          3

7521 WARD        7698          3

7654 MARTIN      7698          3

7844 TURNER      7698          3

7900 JAMES       7698          3

7782 CLARK       7839          2

7934 MILLER      7782          3

3.4.NOCYCLE Examples

创建一个connect by 循环数据,将员工SCOTT指定为员工KING的上级,这样会就出现一个死循环。

创建循环数据:

SQL> update emp e set e.mgr = '7788' where e.ename = 'KING';

查询以KING开始的员工的上级:

SQL> select e.empno, e.ename, e.mgr, level

2    from emp e

3  connect by prior e.empno = e.mgr

4   start with e.ename = 'KING';

select e.empno, e.ename, e.mgr, level

from emp e

connect by prior e.empno = e.mgr

start with e.ename = 'KING'

ORA-01436: 用户数据中的 CONNECT BY 循环

使用NOCYCLE参数,查询以KING开始的员工上级:

SQL> select e.empno, e.ename, e.mgr, level, connect_by_iscycle "CYCLE"

2    from emp e

3  connect by nocycle prior e.empno = e.mgr

4   start with e.ename = 'KING';

EMPNO ENAME        MGR      LEVEL      CYCLE

----- ---------- ----- ---------- ----------

7839 KING        7788          1          0

7566 JONES       7839          2          0

7788 SCOTT       7566          3          1

7876 ADAMS       7788          4          0

7902 FORD        7566          3          0

7369 SMITH       7902          4          0

7698 BLAKE       7839          2          0

7499 ALLEN       7698          3          0

7521 WARD        7698          3          0

7654 MARTIN      7698          3          0

7844 TURNER      7698          3          0

7900 JAMES       7698          3          0

7782 CLARK       7839          2          0

7934 MILLER      7782          3          0

Oracle数据库中序列(SEQUENCE)的用法详解

Oracle数据库中序列(SEQUENCE)的用法详解   在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...

Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例

Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13|  分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...

oracle中的exists 和 in 用法详解

以前一直不知道exists和in的用法与效率,这次的项目中需要用到,所以自己研究了一下.下面是我举两个例子说明两者之间的效率问题. 前言概述: “exists”和“in”的效率问题,涉及到效率问题也就 ...

Oracle创建表语句(Create table)语法详解及示例

创建表(Create table)语法详解1. ORACLE常用的字段类型ORACLE常用的字段类型有VARCHAR2 (size) 可变长度的字符串, 必须规定长度CHAR(size) 固定长度的字 ...

switch语句中default用法详解

当年学C语言switch开关语句的时候,很多人会告诉你它是这么用的: switch(表达式){ case常量表达式1: 语句1;break; case常量表达式2: 语句2;break; - case ...

sql语句-CASE WHEN用法详解

当我们需要从数据源上 直接判断数据显示代表的含义的时候 ,就可以在SQL语句中使用 Case When这个函数了. Case具有两种格式.简单Case函数和Case搜索函数. 第一种 格式 : 简单C ...

oracle expdp/impdp 用法详解

http://hi.baidu.com/hzfsai/item/4a4b3fc4b1cf7e51ad00efbd oracle expdp/impdp 用法详解 Data Pump 反映了整个导出/导 ...

oracle正则表达式regexp_like的用法详解

oracle正则表达式regexp_like的用法详解 /*ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与IN ...

oracle数据库定时任务dbms_job的用法详解

本文来源:Ruthless 一.dbms_job涉及到的知识点   1.创建job: variable jobno number; ...

随机推荐

在 SharePoint Server 2016 本地环境中设置 OneDrive for Business

建议补丁 建议在sharepoint2016打上KB3127940补丁,补丁下载地址 https://support.microsoft.com/zh-cn/kb/3127940 当然不打,也可以用O ...

Sublime Text 3 高效编码快捷键

Sublime Text 3 高效编码快捷键   1.快速跳到第20行 Ctrl+p 框中输入 “  :20 ”   2.在文件夹中查看文件 Ctrl+p 框中输入 “ index.html”  更快 ...

IOS managerTime

1. NSString ->NSdate NSString *birthday =  self.btnBirthday.titleLabel.text; NSDateFormatter *dat ...

http://blog.csdn.net/chenriwei2/article/details/38047119

SSP或者说是空间金字塔匹配(spatial pyramid matching or SPM)是BoW的一个扩展,它把一张图片划分为从不同的分辨率级别然后聚合这些不同分辨率的图像,在深度学习之前SPM ...

《深入理解bootstrap》读书笔记:第一章 入门准备

一.bootstrap框架简介 Bootstrap是最流行的前端开发框架. 什么是框架:开发过程的半成品. bootstrap具有以下重要特性: (1)完整的CSS样式插件 (2)丰富的预定义样式表 ...

一个通用的makefile

# ESDK the makefile setting file - chenwg@20131014 # you can modify "PC = 1" such as &quot ...

DSP28335的SPI发送

#include "DSP2833x_Device.h"#include "DSP2833x_Examples.h"unsigned char table[]= ...

uva 116 Unidirectional TSP (DP)

uva 116 Unidirectional TSP Background Problems that require minimum paths through some domain appear ...

Uva 120 - Stacks of Flapjacks(构造法)

UVA - 120  Stacks of Flapjacks Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld &a ...

jboss学习 - vfs---转载

jboss的VFS是为了解决什么问题,他为什么有用呢 在jboss中有很多类似的资源操作的代码都分散在程序的各个地方,大多数情况下代码首先确定操作的资源的类型,比如是文件或者是文件夹,通过URL加载的 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值