`

Oracle层次关系查询

阅读更多
原文链接: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数据库中,处理具有层次结构的数据是一项常见的需求,尤其是在企业管理、财务分析、组织架构展示等领域。Oracle提供了强大的`CONNECT BY`子句,它能够有效地进行层次查询,帮助用户...

    【原创】oracle树形结构查询,层次查询,hierarical retrival

    层次查询语句可以通过level关键字来确定层次关系,level关键字是可选的,表示等级,表示root、2表示root的child,其他相同的规则。 例如,对于s_emp表,可以使用以下语句来获取树形结构数据: ``` select level, id...

    Oracle层次查询功能的剖析.pdf

    Oracle层次查询功能是Oracle数据库系统中的一个重要特性,它在关系型数据库管理中为处理具有层级关系的数据提供了便利。本文主要探讨了如何利用Oracle的层次查询功能处理和展示类似树形结构的数据。 首先,层次结构...

    基于Oracle的层次树查询功能及实例分析.pdf

    Oracle层次树查询的关键在于`START WITH`和`CONNECT BY`两个子句。`START WITH`定义查询的起始点,可以是任意符合特定条件的节点。而`CONNECT BY`则规定了父节点与子节点之间的连接关系,配合`PRIOR`运算符,可以...

    在Oracle层次查询中给SIBLINGS排序

    Oracle SELECT语句中的START WITH和CONNECT BY子句自动阻断一个层次。缺少这项特性,就需要一个复杂的自联接来确定行之间的逻辑联系。START WITH子句指定被...本文将为大家介绍如何在Oracle层次查询中给SIBLINGS排序。

    Oracle 实战SQL层次查询

    ### Oracle 实战SQL层次查询详解 #### 一、层次查询概念 层次查询,也被称为树型结构查询,是在SQL中最常见的功能之一。这种查询方式主要用于处理具有层级结构的数据,例如组织架构、产品分类等场景。在Oracle...

    Oracle中层次查询的使用和探讨.pdf

    通过掌握Oracle中的层次查询,数据库管理员和开发人员可以更有效地处理具有层次关系的数据,提高查询效率,简化代码,从而优化数据库应用的性能和用户体验。参考文献和专业指导提供了更深入的理论支持和实践案例,...

    oracle 基于 树结构查询

    Oracle 中的树结构查询基于 CONNECT BY 语句,该语句可以根据父子关系将数据连入树型结构中。 CONNECT BY 语句的基本格式如下: SELECT 。。。CONNECT BY {PRIOR 列名 1=列名 2|列名 1=PRIOR 列名 2}[START WITH]...

    oracle层次汇总存储过程

    Oracle层次汇总存储过程是Oracle数据库中用于处理层级数据的一种高效技术。在数据库设计中,层级数据常见于组织结构、产品目录、地理位置等场景。Oracle提供了几种处理层级数据的方法,包括自连接、递归子查询、...

    Oracle递归树形结构查询功能

    递归树形结构查询主要依赖于`CONNECT BY`和`PRIOR`关键字,它们允许我们构建复杂的层级查询,以展示数据的层次关系。 在Oracle中,树形结构查询的基本语法如下: ```sql SELECT [LEVEL], * FROM table_name START ...

    oracle树结构查询方法

    总之,Oracle数据库支持对树形结构数据的高效查询,通过`CONNECT BY`和`START WITH`子句,我们可以轻松地构建和遍历这些层次关系,这对于理解和操作复杂的数据结构至关重要。在进行树结构查询时,理解这些语句的工作...

    oracle 的包,层次化查询和触发器视频教程

    本教程主要涵盖Oracle数据库中的“包”、“层次化查询”和“触发器”这三个关键概念,对于初学者来说,理解并掌握这些知识对于进一步深入学习Oracle数据库至关重要。 首先,让我们详细探讨“包”(Package)。在...

    oracle递归、迭代

    递归查询是Oracle中一种特殊的查询方式,主要用于检索具有层次结构的数据。在Oracle中实现递归查询需要用到`START WITH... CONNECT BY PRIOR`语法。 #### 三、递归查询的基本语法 递归查询的基本语法如下: ```sql...

    Oracle查询树形结构

    根结点是树形结构的起点,连接条件是用于连接父子节点的关系,过滤条件是用于过滤查询结果的条件。 例如,在 DEPT 表中,查询所有部门的树形结构可以使用以下语句: SELECT * FROM persons.dept START WITH deptid...

    层次查询功能在Oracle数据库中的应用.pdf

    5. Oracle层次查询结果将按照特定的次序返回数据行,从而保证数据的有序显示。 需要注意的是,层次查询在使用过程中存在一些限制。首先,查询不能涉及数据表之间的JOIN连接,也不能从包含JOIN连接的视图中获取数据...

    Oracle树查询总结

    这种查询模式允许我们以递归方式遍历和检索具有层级关系的数据,例如组织结构、产品分类或者文件系统等。下面将详细解析这些查询方法。 1. **查找树中的所有顶级父节点** 使用 `WHERE parent_id=0` 即可找到树中的...

    Oracle复杂查询语句的使用

    ### Oracle复杂查询语句的使用 ...总结来说,Oracle中的复杂查询语句是处理多表关联、多层次数据的有效工具。通过对连接查询、嵌套查询和递归查询的理解与运用,可以大大提高数据处理的能力和效率。

    Oracle树结构查询(图)

    在处理复杂的数据查询时,尤其在数据具有层次性或树状结构的情况下,Oracle提供了一种高效的方法——树结构查询。本篇文章将深入探讨Oracle如何处理这类查询,并通过一个具体的文档案例进行解析。 首先,我们要了解...

    oracle递归查询的例子

    递归查询允许用户执行多级关联查询,特别适用于处理具有层次结构的数据,例如组织结构图、文件系统目录等。本文将通过一个具体的例子来详细介绍如何在 Oracle 中实现递归查询。 #### 二、基础知识回顾 在深入讨论...

    oracle高级查询技巧

    WITH子句(也称为公用表表达式,CTE)配合CONNECT BY语句可用于执行递归查询,解决层次结构问题,如组织架构、产品分类树等。 八、游标 游标(Cursor)允许逐行处理查询结果,对于循环处理大量数据或在PL/SQL代码中...

Global site tag (gtag.js) - Google Analytics