原文链接:
http://www.examda.com/oracle/zonghe/20100805/092741666.html
[导读]Oracle是一种关系型数据库,在表中不可能以层次的关系存放数据,但是oracle提供了层次(树形)查询语句,使用树的遍历来获得层次关系的数据。 sql语法
select column,expr….
From table
Where conditions
Start with conditions
Connect by prior conditions
关键字和伪列介绍
Select
部分可以是字段或者表达式,或者伪列,如level,connect_by_isleaf等.
From
From后面可以是table,view但是只能是一个table,view中不能有多个表连接.
Where
条件限制了查询返回的行,但是其只影响节点自身,该节点的下层child不受影响
,属于节点的截断.
start with
确定遍历查询的开始点,可以是子查询,也可以不指定,不指定表示每个节点都作为起始节点来遍历一遍
connect by prior
确定遍历的方向,即是找子孙节点还是找祖先节点,遍历方向分为:自上向下,自下向上.
如果prior字段放在父字段前面,则表示要做自下向上的遍历;
如果prior字段放在子字段段前面,则表示要做自上向下的遍历;
和关键字prior放在=号左边右边没关系。
父字段:指明记录上一节点的字段如emp表中的mgr字段;
子字段:用来和父字段连接的字段,如emp标中的empno字段
level
查询的起始节点level为1,子孙依次增加,代表每个节点在家族树中的层次关系
connect_by_isleaf
是否叶子节点,如果查询时自顶向下,则叶子节点为1,如果自下向上,则根节点为1
connect _by_root column
查找子节点,叶子节点对应的根节点,10g新增的,这个很有用
prior
表示父节点,可以用在selelct部分,也可以用在connect by部分
nocycle
如果出现循环,在connect by中制定nocycle选项,查询将跳过循环部分的节点,避免10g之前的抱错。
connect_iscycle
如果出现循环,则为1,可以找出哪一条记录出现了循环。需要在connect by中加上nocycle选项
sys_connect_by_path
按path的顺序把字段连起来,做行列转换的时候需要。
Siblings
用于对树形遍历结果的排序,普通的排序会打乱树形遍历结果的层次关系,加上此关键字,可以不改变树形遍历结果的层次关系,只是在每一层内部按关键字排序,相当于做组内排序了,用法为order siblings by col
节点修剪和分支修剪
where子句的限制将会做节点的修剪,但是其后代不会受到影响,相对应,connect by中加上条件,将会把满足条件的节点以及后代修剪,属于分支修剪。
格式化输出
利用lpad函数和level,可以格式化输出记录间父子层次关系,方便阅读。
应用例子
利用lpad函数和level伪列,格式化输出
SQL> select empno,ename,lpad(empno,length(empno)+(level-1)*4,'-') from emp start with mgr is null connect by prior empno=mgr;
EMPNO ENAME LPAD(EMPNO,LENGTH(EMPNO)+(LEVE
----- ---------- --------------------------------------------------------------------------------
7839 KING 7839
7566 JONES ----7566
7788 SCOTT --------7788
7876 ADAMS ------------7876
7902 FORD --------7902
7369 SMITH ------------7369
7698 BLAKE ----7698
7499 ALLEN --------7499
7521 WARD --------7521
7654 MARTIN --------7654
7844 TURNER --------7844
7900 JAMES --------7900
7782 CLARK ----7782
7934 MILLER --------7934
自上向下,自下向上遍历查询
自下向上遍历
SQL> select empno,ename,level from emp start with empno=7788 connect by prior mgr=empno;
EMPNO ENAME LEVEL
----- ---------- ----------
7788 SCOTT 1
7566 JONES 2
7839 KING 3
自上向下遍历
SQL> select empno,ename,level from emp start with empno=7788 connect by prior empno=mgr;
EMPNO ENAME LEVEL
----- ---------- ----------
7788 SCOTT 1
7876 ADAMS 2
分享到:
相关推荐
### Oracle层次查询详解 在Oracle数据库中,处理具有层次结构的数据是一项常见的需求,尤其是在企业管理、财务分析、组织架构展示等领域。Oracle提供了强大的`CONNECT BY`子句,它能够有效地进行层次查询,帮助用户...
层次查询语句可以通过level关键字来确定层次关系,level关键字是可选的,表示等级,表示root、2表示root的child,其他相同的规则。 例如,对于s_emp表,可以使用以下语句来获取树形结构数据: ``` select level, id...
Oracle层次查询功能是Oracle数据库系统中的一个重要特性,它在关系型数据库管理中为处理具有层级关系的数据提供了便利。本文主要探讨了如何利用Oracle的层次查询功能处理和展示类似树形结构的数据。 首先,层次结构...
Oracle层次树查询的关键在于`START WITH`和`CONNECT BY`两个子句。`START WITH`定义查询的起始点,可以是任意符合特定条件的节点。而`CONNECT BY`则规定了父节点与子节点之间的连接关系,配合`PRIOR`运算符,可以...
Oracle SELECT语句中的START WITH和CONNECT BY子句自动阻断一个层次。缺少这项特性,就需要一个复杂的自联接来确定行之间的逻辑联系。START WITH子句指定被...本文将为大家介绍如何在Oracle层次查询中给SIBLINGS排序。
### Oracle 实战SQL层次查询详解 #### 一、层次查询概念 层次查询,也被称为树型结构查询,是在SQL中最常见的功能之一。这种查询方式主要用于处理具有层级结构的数据,例如组织架构、产品分类等场景。在Oracle...
通过掌握Oracle中的层次查询,数据库管理员和开发人员可以更有效地处理具有层次关系的数据,提高查询效率,简化代码,从而优化数据库应用的性能和用户体验。参考文献和专业指导提供了更深入的理论支持和实践案例,...
Oracle 中的树结构查询基于 CONNECT BY 语句,该语句可以根据父子关系将数据连入树型结构中。 CONNECT BY 语句的基本格式如下: SELECT 。。。CONNECT BY {PRIOR 列名 1=列名 2|列名 1=PRIOR 列名 2}[START WITH]...
Oracle层次汇总存储过程是Oracle数据库中用于处理层级数据的一种高效技术。在数据库设计中,层级数据常见于组织结构、产品目录、地理位置等场景。Oracle提供了几种处理层级数据的方法,包括自连接、递归子查询、...
递归树形结构查询主要依赖于`CONNECT BY`和`PRIOR`关键字,它们允许我们构建复杂的层级查询,以展示数据的层次关系。 在Oracle中,树形结构查询的基本语法如下: ```sql SELECT [LEVEL], * FROM table_name START ...
总之,Oracle数据库支持对树形结构数据的高效查询,通过`CONNECT BY`和`START WITH`子句,我们可以轻松地构建和遍历这些层次关系,这对于理解和操作复杂的数据结构至关重要。在进行树结构查询时,理解这些语句的工作...
本教程主要涵盖Oracle数据库中的“包”、“层次化查询”和“触发器”这三个关键概念,对于初学者来说,理解并掌握这些知识对于进一步深入学习Oracle数据库至关重要。 首先,让我们详细探讨“包”(Package)。在...
递归查询是Oracle中一种特殊的查询方式,主要用于检索具有层次结构的数据。在Oracle中实现递归查询需要用到`START WITH... CONNECT BY PRIOR`语法。 #### 三、递归查询的基本语法 递归查询的基本语法如下: ```sql...
5. Oracle层次查询结果将按照特定的次序返回数据行,从而保证数据的有序显示。 需要注意的是,层次查询在使用过程中存在一些限制。首先,查询不能涉及数据表之间的JOIN连接,也不能从包含JOIN连接的视图中获取数据...
这种查询模式允许我们以递归方式遍历和检索具有层级关系的数据,例如组织结构、产品分类或者文件系统等。下面将详细解析这些查询方法。 1. **查找树中的所有顶级父节点** 使用 `WHERE parent_id=0` 即可找到树中的...
### Oracle复杂查询语句的使用 ...总结来说,Oracle中的复杂查询语句是处理多表关联、多层次数据的有效工具。通过对连接查询、嵌套查询和递归查询的理解与运用,可以大大提高数据处理的能力和效率。
总结来说,Oracle的层次查询提供了一种有效的方法来处理和展示具有层级关系的数据。通过`START WITH`、`CONNECT BY`和`SYS_CONNECT_BY_PATH`等工具,我们可以轻松地构建和探索复杂的数据结构。理解并熟练运用这些...
在处理复杂的数据查询时,尤其在数据具有层次性或树状结构的情况下,Oracle提供了一种高效的方法——树结构查询。本篇文章将深入探讨Oracle如何处理这类查询,并通过一个具体的文档案例进行解析。 首先,我们要了解...
在构建和维护具有层次关系或树状结构的数据时,如组织架构、产品分类、文件目录等,经常需要从数据库中检索这些信息。Oracle数据库提供了强大的查询功能,使得对这类树形结构数据的查询变得简单而高效。本文将深入...
递归查询允许用户执行多级关联查询,特别适用于处理具有层次结构的数据,例如组织结构图、文件系统目录等。本文将通过一个具体的例子来详细介绍如何在 Oracle 中实现递归查询。 #### 二、基础知识回顾 在深入讨论...