转自:http://blog.csdn.net/nsj820/article/details/6299276
层次查询的概念
语法格式:
select [level], column, expr... from table
[where condition]
start with condition
connect by [prior column1= column2 |
column1 = prior column2];
层次查询是通过start with和connect by子句标识的:
1.其中level关键字是可选的,表示等级,1表示root,2表示root的child,其他相同的规则。
2.From之后可以是table,view但是只能是一个table。
3.Where条件限制了查询返回的行,但是不影响层次关系,属于将节点截断,但是这个被截断的节点的下层child不受影响。
4.Start with是表示开始节点,对于一个真实的层次关系,必须要有这个子句,但是不是必须的。
5.connect by prior是指定父子关系,其中prior的位置不一定要在connect by之后,对于一个真实的层次关系,这也是必须的。
对于from是视图的,那么这个view不能包含join。
层次查询限制
1.层次查询from 之后如果是table,只能是一个table,不能有join。
2.from之后如果是view,则view不能是带join的。
3.使用order by子句,order子句是在等级层次做完之后开始的,所以对于层次查询来说没有什么意义,除非特别关注level,获得某行在层次中的深度,但是这两种都会破坏层次。见增强特性中的使用siblings排序。
4.在start with中表达式可以有子查询,但是connect by中不能有子查询。
层次查询的增强特性
1、SYS_CONNECT_BY_PATH
Oracle 9i提供了sys_connect_by_path(column,char),其中column是字符型或能自动转换成字符型的列名。它的主要目的就是将父节点到当前节点的”path”按照指定的模式展现出现。这个函数只能使用在层次查询中。
下面的是oracle10g新增特性
2、 CONNECT_BY_ISLEAF
在oracle9i的时候,查找指定root下的叶子节点,是很复杂的,oracle10g引入了一个新的函数,connect_by_isleaf,如果行的值为0表示不是叶子节点,1表示是叶子节点。
3、CONNECT_BY_ISCYCLE和NOCYCLE关键字
如果从root节点开始找其子孙,找到一行,结果发生和祖先互为子孙的情况,则发生循环,oracle会报ORA-01436: CONNECT BY loop in user data,在9i中只能将发生死循环的不加入到树中或删除,在10g中可以用nocycle关键字加在connect by之后,避免循环的参加查询操作。并且通过connect_by_iscycle得到哪个节点发生循环。0表示未发生循环,1表示发生了循环。
4、CONNECT_BY_ROOT
Oracle10g新增connect_by_root,用在列名之前表示此行的根节点的相同列名的值。
5、使用SIBLINGS关键字排序
对于层次查询如果用order by排序,比如order by last_name则是先做完层次获得level,然后按last_name排序,这样破坏了层次,比如特别关注某行的深度,按level排序,也是会破坏层次的。
在oracle10g中,增加了siblings关键字的排序。
语法:order siblings by <expre>
它会保护层次,并且在每个等级中按expre排序。
示例:
1、 构建测试表与插入测试语句
- create table tab_connect_by (child number,parent number);
- insert into tab_connect_by (CHILD, PARENT) values(2, 5);
- insert into tab_connect_by (CHILD, PARENT) values(3, 5);
- insert into tab_connect_by (CHILD, PARENT) values(10, 15);
- insert into tab_connect_by (CHILD, PARENT) values(5, 15);
- insert into tab_connect_by (CHILD, PARENT) values(9, 17);
- insert into tab_connect_by (CHILD, PARENT) values(8, 17);
- insert into tab_connect_by (CHILD, PARENT) values(15, 38);
- insert into tab_connect_by (CHILD, PARENT) values(17, 38);
- insert into tab_connect_by (CHILD, PARENT) values(6, 38);
- insert into tab_connect_by (CHILD, PARENT) values(13, 26);
- insert into tab_connect_by (CHILD, PARENT) values(1, 26);
- insert into tab_connect_by (CHILD, PARENT) values(12, 26);
- insert into tab_connect_by (CHILD, PARENT) values(11, 18);
- insert into tab_connect_by (CHILD, PARENT) values(7, 18);
- insert into tab_connect_by (CHILD, PARENT) values(38, null);
- insert into tab_connect_by (CHILD, PARENT) values(26, null);
- insert into tab_connect_by (CHILD, PARENT) values(18, null);
- commit;
2、 查询语句1
- select a.child,
- a.parent,
- level "层次",
- sys_connect_by_path(child, '<-') "合并层次",
- prior a.child "父节点",
- connect_by_root a.child "根节点",
- decode(connect_by_isleaf, 1, a.child, null) "子节点",
- decode(connect_by_isleaf, 1, '是', '否') "是否子节点"
- from tab_connect_by a
- start with a.parent is null --从parent为空开始扫描
- connect by prior a.child = a.parent --以child为父列连接parent
- order siblings by child desc --对层次排序
- ;
3、 查询语句2
- Select level, connect_by_iscycle,connect_by_isleaf,parent, child
- From tab_connect_by
- Connect by nocycle prior child = parent
- Start with parent is null;
分享到:
相关推荐
深入讲解Oracle基本概念以及Oracle结构,对深入理解Oracle结构有很大帮助
2. **SQL语言**:Oracle 10g支持结构化查询语言(SQL),包括SELECT用于查询数据,INSERT用于插入数据,UPDATE用于修改数据,DELETE用于删除数据,以及DDL(Data Definition Language)用于创建和管理数据库对象。...
1. **Oracle数据库基础**:首先,你会了解到数据库的基本概念,如数据模型(层次、网络、关系)、关系数据库理论,以及Oracle数据库系统的特点和优势。此外,还会介绍Oracle数据库的安装、配置和初始化过程。 2. **...
这个“个人学习Oracle笔记”文件很可能是作者在深入学习Oracle数据库的过程中积累的知识点总结,旨在帮助初学者从基础开始逐步掌握Oracle的核心概念和技术。 Oracle数据库的基础知识包括以下几个主要方面: 1. **...
总的来说,Oracle的递归SQL是处理层次数据的强大工具,可以灵活地构建和查询树状结构。通过理解`start with`、`connect by prior`和`order siblings by`的用法,我们可以有效地展示和操作层次数据。不过,实际应用时...
WITH子句(也称为公用表表达式,CTE)配合CONNECT BY语句可用于执行递归查询,解决层次结构问题,如组织架构、产品分类树等。 八、游标 游标(Cursor)允许逐行处理查询结果,对于循环处理大量数据或在PL/SQL代码中...
5. 层次查询(HIERARICAL RETRIVEL)通常指在Oracle中通过CONNECT BY语句实现的树形结构数据查询,可以方便地查询具有层级关系的数据。 6. DECODE函数和行列互换则是对数据进行条件处理和转置的重要工具。DECODE...
在Oracle数据库学习和优化过程中,了解并掌握性能调整的知识至关重要。Oracle 11g作为一款成熟的关系型数据库管理系统,其性能调整能力一直是众多数据库管理员(DBA)和开发人员关注的焦点。本学习笔记以第17章构筑...
Oracle性能优化是一个复杂而精细的...总的来说,Oracle性能优化是一个涉及多方面、多层次的过程,需要综合考虑系统环境、数据库设计、SQL执行和硬件资源的协调。通过不断监控、分析和调整,才能实现数据库的最佳性能。
本教程主要涵盖Oracle数据库中的“包”、“层次化查询”和“触发器”这三个关键概念,对于初学者来说,理解并掌握这些知识对于进一步深入学习Oracle数据库至关重要。 首先,让我们详细探讨“包”(Package)。在...
在Oracle数据库中,SQL开发是核心技能之一,尤其在处理复杂的数据关系时,层次...通过本教程的系统学习,学员不仅可以了解层次查询的基本概念,还能掌握如何在实际项目中灵活运用,从而成为更高效的Oracle SQL开发者。
数据模型是数据库结构的基础,主要包括层次模型、网络模型和关系模型,而Oracle采用的是关系模型。数据库实例是内存结构和后台进程的集合,用于处理数据库操作;服务则是客户端连接到数据库的方式。表空间和数据文件...
本文将深入探讨Oracle的学习路径,包括新手入门和进阶精通的关键知识点。 一、Oracle基础知识 1. 数据库概念:了解数据库的基本概念,如数据模型(关系型、层次型、网络型),实体、属性、键的概念,以及数据库...
本资料包主要涵盖数据仓库的基础知识,对于希望深入了解Oracle数据仓库技术的人来说,无疑是一份宝贵的学习资源。 "Data Warehousing Fundamentals.ppt" 这个文件可能包含了数据仓库的基本概念,如数据仓库的定义、...
本书针对不同层次的读者提供了全面深入的学习资料,无论是PHP或Oracle的新手还是有一定经验的开发者都能从中受益。 #### 二、PHP与Oracle简介 - **PHP**:是一种广泛使用的开源脚本语言,特别适用于Web开发并可嵌入...
从提供的标题、描述以及部分文本内容来看,这份“Oracle学习笔记”主要围绕Oracle数据库中的查询语句及其各种类型进行深入探讨。尽管描述部分重复了标题的文字,但主要内容段落包含了丰富的信息,下面将对这些知识点...
在Oracle学习的过程中,首先需要理解数据库的基本概念,包括数据库管理系统(DBMS)、数据模型(如层次模型、网状模型、关系模型)以及SQL语言。Oracle基于关系模型,其核心是表、视图、索引、存储过程等数据结构。...
- **1.1.3 数据模型**:讲解实体联系模型(E-R Model)、层次模型、网状模型和关系模型等不同数据模型的概念。 - **1.1.4 关系数据库的功能**:阐述关系数据库管理系统(RDBMS)的主要功能,如数据完整性、并发控制等...
3. 在线教程和视频课程:网上有大量的Oracle学习视频和教程,从入门到进阶,从案例分析到脚本分享,适合不同层次的学习者。 4. 实验操作:通过实验操作可以加深对Oracle数据库的理解和应用,建议学习者多做实验,...