原文链接:
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 SELECT语句中的START WITH和CONNECT BY子句自动阻断一个层次。缺少这项特性,就需要一个复杂的自联接来确定行之间的逻辑联系。START WITH子句指定被...本文将为大家介绍如何在Oracle层次查询中给SIBLINGS排序。
Oracle层次查询功能的剖析.pdf
Oracle中层次查询的使用和探讨.pdf
基于Oracle的层次树查询功能及实例分析.pdf
在Oracle中,有个很方便的特性,层次关系子句。它可以实现需要递归关联查询的各种情景,Oracle_hierarchical_SQL_查询应用.doc里面给出了几个情景,用详细的sql语句来说明怎么查询出需要的组合信息
层次查询功能在Oracle数据库中的应用.pdf
下面我跟大家分享下我的心得,也就是基于这种设计怎么做数形图,简单的做法就是查询出一个list集合就可以,要怎么办呢先来看下我的数据表
其次,Oracle数据库的性能表现出色,采用先进的查询优化技术和数据存储机制,能够高效地处理大规模数据和复杂查询。再者,Oracle数据库可以轻松扩展以适应不断增长的数据和用户需求,支持集群和分布式数据库架构,...
希望对大家有所帮助,有点怀旧哦 :) 好东西,就是要跟你分享.谢谢支持. 地基的深度取决你将来的层次,地基的广度决定你将来的空间.
Oracle是当今各领域中应用比较广泛的一个大型关系型数据库产品,它以其所拥有的稳定、可伸缩性强以及安全可靠等特性受到越来越多的系统开发人员的青睐,正成为企业开发信息系统的首选产品。同其他数据库管理系统相比...
数据仓库技术是目前已知的比较成熟和被广泛采用的解决方案,用于整和电信运营企业内部所有分散的原始业务数据,并通过便捷有效的数据访问手段,可以支持企业内部不同部门,不同需求,不同层次的用户随时获得自己所需...
基于Oracle数据库的网上书店,,购物车功能,订单都实现了,代码有注释,附带数据库设计的pdc文件,项目层次分明(表示层、控制层、业务层、数据访问层),没有用框架,是我自己用反射封装的jdbc增删改查的底层代码...
SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。 SQL语言主要包含5个部分 数据定义...
在许多实际应用中,数据之间的关系是层次关系。例如,由零部件组成的汽车结构、组织结构和家族谱系等都是典型的层次结构关系。Oracle Database 10g系统,提供了层次查询的功能。 现在,数据库系统越来越强调对业务...
Oracle是当今各领域中应用比较广泛的一个大型关系型数据库产品,它以其所拥有的稳定、可伸缩性强以及安全可靠等特性受到越来越多的系统开发人员的青睐,正成为企业开发信息系统的首选产品。同其他数据库管理系统相比...
什么是执行计划,如何访问数据,执行计划层次关系、例子解说等几个方面,全面介绍oracle执行计划说明,并进一步给出优化建议等相关内容。
20.6. 关联子查询 126 20.7. 嵌套子查询 127 二十一、 高级查询 128 22.1. UNION操作符 128 22.2. 层次化查询 129 22.3. 格式化查询 131 22.4. 遍历查询 133 22.5. 扩展Group By子句 134 二十二、 模式对象 137 23.1...
8 管理表空间和数据文件 目标 8-2 概述 8-3 数据库的储存层次 8-5 SYSTEM 和非 SYSTEM 表空间 8-7 创建表空间 8-8 表空间的空间管理 8-9 本地管理表空间 8-10 字典管理表空间 8-11 改变存储设置 8-12 回滚表空间 8-...
数据库管理系统的内部分多个层次,由应用层、语言定义及其翻译处理层、数据存取层、数据存储层、操作系统以及数据库组成。 (3) 数据库系统由数据库、操作系统、数据库管理系统、开发工具、应用系统、数据库管理员...