为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的。
Oracle中的select语句可以用start with ... connect by prior ...子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是:
select ... from
where <过滤条件,用于对返回的所有记录进行过滤>
start with <根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树>
connect by [prior] <连接条件,其中用prior表示上一条记录,比如:connect by prior t.id = t.parent_id就是说上一条记录的id 是本条记录的parent_id,即本记录的父亲是上一条记录>
下面我们直接来看实例,查询'KING'的所有下属雇员。SQL语句如下:
- select *
- from scott.emp e
- start with e.ename = 'KING'
- connect by prior e.empno = e.mgr;
我们再来看另外一个实例,反过来查询'SMITH'的所有上司。SQL语句如下:
- select *
- from scott.emp e
- start with e.ename = 'SMITH'
- connect by e.empno = prior e.mgr;
通过上面的两个实例,估计大家应该理解的差不多了,接下来介绍connect by的几个固定搭档。
1、sys_connect_by_path函数
语法:sys_connect_by_path(列名, '分隔符')。
作用:从start with的地方开始遍历,将遍历到的路径根据函数中的分隔符,组成一个新的字符串。
- select sys_connect_by_path(ename, '/') ename_tree
- from scott.emp
- start with ename = 'KING'
- connect by mgr = prior empno;
插个题外话,介绍sys_connect_by_path函数使用的一个小技巧,把查询行转换成列,把表emp的所有列名以'|'分隔开输出(提示:大家可以把下面的语句拆开来逐个分析),SQL语句如下:
- select max(ltrim(sys_connect_by_path(column_name, '|'), '|')) column_names
- from (select column_name, rownum rnum
- from user_tab_columns
- where table_name = 'EMP')
- start with rnum = 1
- connect by rnum = rownum;
2、level:在结构化查询结果中,每一行都是结构中的一个节点,level表示该节点在结构中的层次,根节点为1,根节点的子节点为2,以此类推。
下面SQL语句很直观的展示效果:
- select ename, sys_connect_by_path(ename, '/') ename_tree, level
- from scott.emp
- start with ename = 'KING'
- connect by mgr = prior empno;
3、connect_by_root:用在列名之前,返回当前节点的根节点对应列的值。connect_by_isleaf:返回当前节点是否为叶子节点,“是”返回1,“否”返回0。
下面SQL语句很直观的展示效果:
- select sys_connect_by_path(ename, '/') ename_tree,
- connect_by_root ename as root,
- connect_by_isleaf as isleaf
- from scott.emp e
- start with e.ename = 'KING'
- connect by prior e.empno = e.mgr;
相关推荐
以下是对"Oracle高级查询技巧"的详细阐述。 一、子查询 子查询是嵌套在其他SQL语句中的查询,用于获取主查询所需的值。它可以作为SELECT、FROM或WHERE子句的一部分。例如,你可以使用子查询来找到某个部门薪水最高...
Oracle高级SQL学习与练习涵盖了数据库编程中的一系列高级主题,旨在帮助数据库开发者和管理员提高解决复杂问题的能力。在Oracle数据库系统中,高级SQL技能是进行高效数据管理、查询优化和复杂数据处理的基础。 1. ...
### Oracle中的START WITH CONNECT BY PRIOR 用法详解 #### 一、概念介绍 在Oracle数据库中,`START WITH` 和 `CONNECT BY PRIOR` 是两个非常强大的特性,主要用于处理具有层级结构的数据。这两个特性可以帮助我们...
本文将深入探讨如何在Oracle中执行树状结构查询,理解其背后的逻辑,以及如何利用各种高级特性来优化查询结果。 ### Oracle树状结构查询原理 树状结构查询主要依赖于`START WITH`和`CONNECT BY PRIOR`这两个关键...
通过上述示例,我们可以清晰地看到 Oracle 递归查询的强大之处。它不仅能够有效地处理具有层次结构的数据,还支持高级特性如层级计算和循环检测。掌握这些技巧对于高效管理和查询复杂数据结构至关重要。在实际工作中...
Oracle的`CONNECT BY`和分析函数是数据库查询中的两种强大工具,主要用于处理复杂的数据结构和进行高级数据分析。本文将深入探讨这两种技术。 ### Oracle `CONNECT BY` 用法总结 `CONNECT BY` 是Oracle SQL中用于...
在Oracle 10g数据库系统中,高级SQL函数是开发者不可或缺的工具,它们极大地扩展了标准SQL的功能,使得数据查询和处理更为灵活高效。本文将深入探讨这些高级SQL函数,帮助你更好地理解和运用它们。 一、窗口函数 ...
他认为对于SQL的学习是永无止境的,相信每一个查询Oracle数据库的人都需要精通SQL语言,才能写出高效的查询。他参与本书的编写就是为了帮助别人实现这一目标。 目录 封面 -11 封底 -10 扉页 -9 版权 -8 版权声明 -7...
在Oracle数据库中,将查询结果转化为树状结构是一项高级而实用的技能,尤其适用于处理具有层级关系的数据,如产品分类、组织架构等。本篇将深入解析如何利用Oracle的特定功能,实现数据的树状展示。 ### 核心概念:...
树形查询通常涉及到递归查询,Oracle数据库提供了一种名为“CONNECT BY”的语法,用于处理层次关系数据。通过指定起始节点(START WITH)和连接条件(CONNECT BY),我们可以构建出一个递归查询,从而获取整个树结构...
另外,如果需要查看某个角色拥有哪些权限,可以查询dba_sys_privs视图,例如:`SELECT grantee, privilege FROM dba_sys_privs WHERE grantee = 'RESOURCE' ORDER BY privilege;`。 此外,Oracle还允许用户之间授权...
在Oracle数据库中,递归查询主要依赖于`START WITH`和`CONNECT BY PRIOR`两个关键语法。本文将详细介绍这些概念以及具体的使用方法。 #### 二、创建示例表 为了更好地理解Oracle中的递归查询,我们首先需要创建...
- 如果希望用户能够查询特定表,还需要授予相应的表权限。例如: - `GRANT SELECT ON 表名 TO 用户名;` 通过以上知识点的总结,我们可以了解到Oracle的基础安装配置以及基本命令的使用方法,并且深入理解了如何...
从给定的Oracle高级编程笔记中,我们可以提炼出多个关键的知识点,这些知识点涵盖了Oracle数据库管理、用户权限、SQL操作以及脚本控制等核心领域。下面将详细展开这些知识点: ### Oracle用户管理与权限 #### 创建...
Oracle提供了一种称为“连接查询”(Connect By)的特有语法,使得我们可以方便地对具有层级关系的数据进行检索。本资料"oracle-tree-sql.rar_oracle"主要探讨的就是如何在Oracle中使用SQL查询树形结构数据。 一、...
6. **`MODEL` 指令:** 这是Oracle中的高级SQL特性,可以处理复杂的矩阵运算和数据转换,包括多行记录的合并。使用`MODEL`指令需要对Oracle SQL有深入理解,但能解决一些其他方法无法处理的复杂问题。 在实际应用中...
5. **递归查询**:使用CONNECT BY语句,我们可以处理层次结构数据,如组织结构或分类树。递归查询通过定义一个起点和递归规则来遍历整个层级。 6. **存储过程**:存储过程是一组预编译的SQL语句,封装在一起作为一...
Oracle提供了多种方法来实现这一目标,包括使用内置函数、PL/SQL过程以及一些高级特性。以下是对标题和描述中所涉及知识点的详细解释: 1. **concat() 函数**: Oracle中的`concat()`函数是最基本的字符串连接方法...
10. **高级SQL特性**:如递归查询(CONNECT BY)、分区表、物质化视图、物化查询块、索引组织表等,这些都是提升数据库性能的重要手段。 11. **数据类型**:详述Oracle支持的各种数据类型,如数值型、字符型、日期...