--connect by 使用详解
/*START WITH 表示递归的种子,而 CONNECT BY 描述递归步骤,
也就是如何从第 n 步发展到第 (n + 1) 步。由于在归结 name
时需要区分第 n 步和第 (n + 1) 步,因此使用 PRIOR 来表明
empid 属于第 n 步,而 mgrid 属于第 (n + 1) 步。在第 1 步,
empid 为 16,mgrid 也必须是 16,因此第 2 步产生‘Scott’、
‘Henry’和‘Zander’。他们的 empid 将作为第 3 步的 PRIOR,
依此类推。
*/
select ename,job
,ename
from scott.emp emp
start with ename in ('WARD')
connect by empno = prior mgr;
/*LEVEL 伪列
最常见的伪列是 LEVEL。这个列的作用是表明产生行的递归步骤 n 属于第几步。
在这个例子中,它表示‘Goyal’与雇员之间相差的管理等级加 1(因为 LEVEL 一开始为 1)。
下面是原先的 Oracle 例子添加了 LEVEL 列之后的样子:
*/
select level,ename,job
from scott.emp emp
start with ename in ('WARD','SMITH','ADAMS')
connect by empno = prior mgr;
/*
CONNECT_BY_ROOT 表达式
CONNECT_BY_ROOT 作用在一个列上,并返回当前行最早的(root)祖先的值。
*/
select connect_by_root ename as root
,ename
from scott.emp emp
start with ename in ('WARD','SMITH','ADAMS')
connect by empno = prior mgr;
/*SYS_CONNECT_BY_PATH() 过程
运行查询时一个常见的问题是:“这个元素与递归的开始有怎样的关系?”,
或者换句话说,“这一行的祖先是什么?”在 Oracle 中,
可以使用 SYS_CONNECT_BY_PATH() 来连接来自每个递归步骤的值,
从而形成一个祖先路径。看看下面这个著名的例子,
它展示了‘ADAMS’每个下属的“从属”链:
*/
--根据员工找审批人
select SYS_CONNECT_BY_PATH(ename, ':') AS chain, ename
from scott.emp emp
start with ename='ADAMS'
connect by empno = prior mgr;
--根据上级找下级
select SYS_CONNECT_BY_PATH(ename, ':') AS chain, ename
from scott.emp emp
start with ename='JONES'
connect by prior empno = mgr;
/*
ORDER SIBLINGS BY 表达式
在 Oracle 中,ORDER SIBLINGS BY 定义返回时同一父亲下各个兄弟之间的顺序。
为了使用 CONNECT BY 递归地按照薪水对所有雇员排序,查询的形式如下:
*/
select SYS_CONNECT_BY_PATH(ename, ':') AS chain,ename
,level
,sal
from scott.emp
start with ename = 'KING'
connect by prior empno = mgr
order siblings by sal;
/*NOCYCLE 关键字
至此我已经介绍了记录递归路径和在运行时检测递归的功能,
实际上还可以映射 Oracle 的 CONNECT BY 查询语法中的 NOCYCLE
关键字。简言之,NOCYCLE 防止递归进入循环。对于第 (n + 1) 步,
任何在祖先中已经存在的候选行都将被忽略。在 Oracle 中,使用方法如下:
*/
select ename
,level
,sal
from scott.emp
start with ename = 'JONES'
CONNECT BY NOCYCLE PRIOR empno = mgr;
/*CONNECT_BY_ISCYCLE
为了“标出”递归中的循环,Oracle 提供了另一个伪列,
即 CONNECT_BY_ISCYCLE。如果当前行是循环的一部分,
则这个列返回 1,否则返回 0。
*/
select ename
,level
,connect_by_iscycle as cycle
from scott.emp
start with ename = 'JONES'
connect by nocycle prior empno = mgr;
/*CONNECT_BY_ISLEAF
与 CONNECT_BY_ISCYCLE 相比,CONNECT_BY_ISLEAF 更轻量一些。
这个伪列只是当一个给定行在递归中是叶子的时候返回 1。
换句话说:该行不会产生任何其他的行。在这个例子中,
叶子指不是经理的雇员。
*/
select ename
,level
,CONNECT_BY_ISLEAF AS isleaf
from scott.emp
start with ename = 'JONES'
connect by nocycle prior empno = mgr;
分享到:
相关推荐
Oracle的`CONNECT BY LEVEL`是数据库查询中用于构建层次结构数据的一种强大工具,尤其是在处理具有层级关系的数据时,如组织架构、产品分类等。本文将深入探讨`CONNECT BY`子句以及`LEVEL`伪列的使用,以帮助你更好...
Connect By 可以列出上下级关系 构造序列 求排列组合 逆转求出下上级的关系路径
### Oracle的Connect By使用示例 #### 一、引言 在关系数据库系统中,进行树状或层次结构数据查询时经常会遇到复杂性问题。Oracle数据库通过提供`START WITH...CONNECT BY`语句来简化这类查询操作。此功能最早出现...
Oracle的`CONNECT BY`和分析函数是数据库查询中的两种强大工具,主要用于处理复杂的数据结构和进行高级数据分析。本文将深入探讨这两种技术。 ### Oracle `CONNECT BY` 用法总结 `CONNECT BY` 是Oracle SQL中用于...
文章中给出了一个名为`t_test_connectby`的数据表例子,其中包含父子关系的节点数据。通过该表,我们可以更直观地了解Connect By的执行过程。 - 不指定起始条件时,使用`CONNECT BY`: ```sql SELECT * FROM t_test...
### Oracle中的Connect By Prior递归算法详解 #### 一、Connect By Prior 子句概述 在Oracle数据库中,`Connect By Prior`子句是一种非常有用的工具,尤其在处理具有层次结构的数据时。它允许用户以一种简洁的方式...
本文章详细介绍了Oracle中connect by...start with...的用法。
ORACLE 查询树型关系(connect_by_prior_start_with) Oracle 查询树型关系是指使用 START WITH 和 CONNECT BY 子句来实现 SQL 的层次查询。从 Oracle 9i 开始,可以通过 SYS_CONNECT_BY_PATH 函数实现将父节点到...
### Oracle Start With.Connect By Prior 子句实现递归查询 #### 概述 在Oracle数据库中,`Start With.Connect By Prior`子句是执行递归查询的一种强大工具,主要用于处理层次结构数据。这类数据通常存在于组织...
"Connect By的使用探索" Connect By是一种递归查询语句,用于实现树形结构的查询和遍历。它是 Oracle 数据库中的一种特色语句,能够高效地查询树形结构的数据。 Connect By的基本语法 Connect By语句的基本语法...
开发遇到一个报错 ORA-01436: CONNECT BY loop in user data (ORA-01436: 用户数据中的 CONNECT BY 循环)。 1. 报错原因 根据网上的资料,产生这个错误的原因是数据形成了循环。例如下面这个语句: SELECT r1....
Oracle数据库中的`CONNECT BY PRIOR`是一个强大的查询构造器,用于处理树形数据结构,尤其在组织层级、部门结构或者员工管理系统中非常常见。这个功能允许我们从一个或多个根节点开始,按照指定的规则遍历整个树结构...
此问题通常是由于 PL/SQL Developer 的配置不当或者使用的 Oracle 客户端版本较低,不支持 `Connect By` 功能。 #### 三、解决步骤 本文将详细介绍如何解决以上问题,并提供了一键解决方法,即通过下载并正确配置 ...
### Oracle数据库中的START WITH 和 CONNECT BY 用法详解 在Oracle数据库中,处理层次结构数据时,`START WITH` 和 `CONNECT BY` 是非常有用的两个关键字。这些关键字可以帮助我们在查询时构建出树形或者层级结构的...
通过实例比较了 SYS_CONNECT_BY_PATH 和 CONNECT_BY_ROOT 的异同,和返回树形的数据结构
在Oracle数据库中,`CONNECT BY` 是一个非常重要的SQL语法,用于构建层次查询,它能够帮助我们处理具有层级关系的数据,比如组织结构、产品分类、树形菜单等。`CONNECT BY` 查询允许从一个表中抽取数据,并按照指定...
CONNECT TO "username" IDENTIFIED BY "password" USING 'ODBC:MYSQLSERVERDSN';` 在上面的语句中,我们创建了一个名为“mysqlsrv”的数据库链接,使用 username 和 password 连接 SQL Server 数据库,使用 ODBC ...
### Oracle中的START WITH CONNECT BY PRIOR 用法详解 #### 一、概念介绍 在Oracle数据库中,`START WITH` 和 `CONNECT BY PRIOR` 是两个非常强大的特性,主要用于处理具有层级结构的数据。这两个特性可以帮助我们...
`START WITH...CONNECT BY PRIOR`是Oracle SQL中的一个特性,用于处理具有层级关系的数据。这个子句允许我们遍历和查询具有父子关系的数据,例如部门和其下属子部门,或者员工和他们的上级经理。 1. **START WITH...
### Connect By Prior 数据库树的应用 #### 概述 在关系型数据库中,尤其是在 Oracle 数据库环境下,构建和查询层次结构数据是一项常见的需求。通过使用 `Connect By Prior` 存储过程,我们可以有效地处理这类问题...