Oracle SELECT语句中的START WITH和CONNECT BY子句自动阻断一个层次。缺少这项特性,就需要一个复杂的自联接来确定行之间的逻辑联系。START WITH子句指定被认为是层次起点,或“根”的一行或几行。然后CONNECT BY PRIOR子句指明哪些行彼此关联。
例如,列表A中的查询从Oracle HR样本模式的EMPLOYEES表中生成一个“Reports To”列表。
column "Reports To" format a30
set pagesize 9999
SELECT LPAD(' ', 2*(LEVEL-1))||last_name "Reports To", employee_id
FROM employees
START WITH employee_id IN (101, 102)
CONNECT BY PRIOR employee_id = manager_id
/
|
列表A
LEVEL伪列表明报告当前嵌套的深度,这里我使用LPAD雇员姓名对它们进行缩排。START WITH条件指出只有雇员101和102被认为是起点。然后CONNECT BY PRIOR子句将一行中的employee_id列与另一行的manager_id列连接起来,指出谁向谁报告。
如果你在HR模式中运行这个查询,你会注意到某个经理列表中的姓没有分类,它们以Oracle在处理层次时遇到它们的顺序排列。
如果你希望下属以字母顺序排列,你可以尝试对原始的last_name列使用ORDER BY。但是,这样会破坏层次,把它变回一个单调的姓名列表。
你还可以首先对伪列LEVEL使用ORDER BY,它说明某个特殊行在层次中的深度。这同样也会破坏层次,首先会列出所有的经理,然后是向他们报告的雇员。
在Oracle 10g(两个版本)中,现在很容易实现这一点:你可以使用新的SIBLINGS关键字建立正确的顺序。其语法如下:
ORDER SIBLINGS BY <expression>
|
因此在查询结尾处增加下面这个子句:
ORDER SIBLINGS BY last_name
|
将会保护层次,并在每个等级中以字母顺序排列雇员的姓。注意最初的last_name用作“Reports To”的别名。“Reports To”中的额外空间会影响排序,因此必须使用最初的last_name。列表B中是增加ORDER SIBLINGS BY前后的输出结果。
SQL> @siblings_without_orderby
Reports To EMPLOYEE_ID
------------------------------ -----------
Kochhar 101
Whalen 200
Mavris 203
Baer 204
Higgins 205
Gietz 206
Greenberg 108
Faviet 109
Chen 110
Sciarra 111
Urman 112
Popp 113
De Haan 102
Hunold 103
Ernst 104
Austin 105
Pataballa 106
Lorentz 107
18 rows selected.
SQL> @siblings_with_orderby
Reports To EMPLOYEE_ID
------------------------------ -----------
De Haan 102
Hunold 103
Austin 105
Ernst 104
Lorentz 107
Pataballa 106
Kochhar 101
Baer 204
Greenberg 108
Chen 110
Faviet 109
Popp 113
Sciarra 111
Urman 112
Higgins 205
Gietz 206
Mavris 203
Whalen 200
18 rows selected.
SQL>
|
列表B
分享到:
相关推荐
### ORACLE和SQL Server的语法区别 #### 一、概述 本文主要介绍Oracle与SQL Server在SQL语言层面的异同之处,重点在于Transact-SQL(T-SQL)与PL/SQL之间的区别,并提供了一些迁移策略。对于希望将现有的Oracle...
在Oracle数据库中,`CONNECT BY` 是一个非常重要的SQL语法,用于构建层次查询,它能够帮助我们处理具有层级关系的数据,比如组织结构、产品分类、树形菜单等。`CONNECT BY` 查询允许从一个表中抽取数据,并按照指定...
### Oracle中的Connect By Prior递归算法详解 #### 一、Connect By Prior 子句概述 在Oracle数据库中,`Connect By Prior`子句是一种非常有用的工具,尤其在处理具有层次结构的数据时。它允许用户以一种简洁的方式...
在Oracle中,树形结构查询的基本语法如下: ```sql SELECT [LEVEL], * FROM table_name START WITH 条件1 CONNECT BY PRIOR 条件2 WHERE 条件3 ORDER BY 排序字段 ``` - `LEVEL`:这是一个伪列,用于表示树的层级...
- 对于ORACLE,递归查询同样使用`WITH`子句和`CONNECT BY`关键字,但`PRIOR`关键字的位置不同,用来指定层次关系的方向。`START WITH`指定了递归开始的条件。 2. **行号**: - ORACLE使用`ROWNUM`来获取行号,它...
10. **高级SQL特性**:如递归查询(CONNECT BY)、分区表、物质化视图、物化查询块、索引组织表等,这些都是提升数据库性能的重要手段。 11. **数据类型**:详述Oracle支持的各种数据类型,如数值型、字符型、日期...
`Connect By Prior` 是一个用于构建层次结构查询的特殊语法,它允许我们在表中按照某种关系建立树形结构。具体语法如下: ```sql SELECT ... FROM table_name START WITH condition CONNECT BY PRIOR column_name =...
在Oracle 10g数据库系统中,创建表空间和用户是一项基本但非常重要的任务。这不仅涉及到数据存储的管理,还关系到数据库的安全性和性能优化。下面将详细介绍如何在Oracle 10g环境中创建表空间、临时表空间以及用户,...
通过以上步骤,我们可以快速地在Oracle 10g环境中创建并配置新用户。创建用户时需要注意指定合适的表空间,并合理分配权限。此外,利用DMP文件可以方便地迁移数据。这些步骤对于Oracle数据库的日常管理和维护至关...
例如,如果想从表中随机选取10%的数据,可以创建一个伪列并按该列进行排序,然后使用`LIMIT`或子查询来获取前10%的行。 最后,关于“TOAD导入数据库方法”,TOAD是一款强大的Oracle数据库管理工具。导入数据的步骤...
- 排序查询:`SELECT * FROM 表名 ORDER BY 列名 ASC/DESC;` - 分组查询:`SELECT 列名 FROM 表名 GROUP BY 列名;` - 联合查询:`SELECT * FROM 表1 UNION SELECT * FROM 表2;` 5. 更新与删除数据: - 更新数据...
在Oracle中,使用 `START WITH` 和 `CONNECT BY PRIOR` 子句来执行此类查询。 **语法示例**: ```sql SELECT * FROM sys_areas START WITH area_name = 'ɳ' CONNECT BY PRIOR area_id = up_area_id ORDER BY area_...
### Oracle基本语法精讲 Oracle数据库是全球领先的数据库管理系统之一,其强大而灵活的数据管理功能在企业级应用中占据重要地位。本文将深入探讨Oracle的基本语法,包括连接、用户管理、表空间创建、用户权限授予、...
CONNECT BY PRIOR`语法。 #### 三、递归查询的基本语法 递归查询的基本语法如下: ```sql SELECT column_name(s) FROM table_name START WITH start_condition CONNECT BY PRIOR parent_column = child_column; `...
Oracle通过START WITH子句指定层次数据的根节点,即查询的起始行,而CONNECT BY子句则用来定义父节点与子节点之间的关系。 层次查询的五个基本步骤如下: 1. 从数据表中选取满足START WITH条件的数据行作为根节点...
在Oracle 11g数据库管理中,日常语法的掌握对于高效操作数据库至关重要。本文将深入解析从给定文件中提取的Oracle日常语法知识点,包括表空间管理、数据文件操作、日志文件管理、用户权限授予以及备份恢复策略,旨在...
"按照当前层次级别排序"可能是指在层次查询中使用`CONNECT BY`和`PRIOR`关键字,这在处理树形结构的数据时非常有用。例如,`SELECT * FROM table START WITH condition CONNECT BY PRIOR id = parent_id ORDER ...