`
cargoj
  • 浏览: 59032 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

ORACLE 10G新语法CONNECT BY层内排序

阅读更多

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的语法区别 #### 一、概述 本文主要介绍Oracle与SQL Server在SQL语言层面的异同之处,重点在于Transact-SQL(T-SQL)与PL/SQL之间的区别,并提供了一些迁移策略。对于希望将现有的Oracle...

    connect by的使用

    在Oracle数据库中,`CONNECT BY` 是一个非常重要的SQL语法,用于构建层次查询,它能够帮助我们处理具有层级关系的数据,比如组织结构、产品分类、树形菜单等。`CONNECT BY` 查询允许从一个表中抽取数据,并按照指定...

    connect_by_prior_递归算法

    ### Oracle中的Connect By Prior递归算法详解 #### 一、Connect By Prior 子句概述 在Oracle数据库中,`Connect By Prior`子句是一种非常有用的工具,尤其在处理具有层次结构的数据时。它允许用户以一种简洁的方式...

    Oracle递归树形结构查询功能

    在Oracle中,树形结构查询的基本语法如下: ```sql SELECT [LEVEL], * FROM table_name START WITH 条件1 CONNECT BY PRIOR 条件2 WHERE 条件3 ORDER BY 排序字段 ``` - `LEVEL`:这是一个伪列,用于表示树的层级...

    ORACLE与SQLSERVER语法差异分析

    - 对于ORACLE,递归查询同样使用`WITH`子句和`CONNECT BY`关键字,但`PRIOR`关键字的位置不同,用来指定层次关系的方向。`START WITH`指定了递归开始的条件。 2. **行号**: - ORACLE使用`ROWNUM`来获取行号,它...

    Oracle Press - Oracle Database 11g SQL

    10. **高级SQL特性**:如递归查询(CONNECT BY)、分区表、物质化视图、物化查询块、索引组织表等,这些都是提升数据库性能的重要手段。 11. **数据类型**:详述Oracle支持的各种数据类型,如数值型、字符型、日期...

    connect by prior数据库树的应用

    `Connect By Prior` 是一个用于构建层次结构查询的特殊语法,它允许我们在表中按照某种关系建立树形结构。具体语法如下: ```sql SELECT ... FROM table_name START WITH condition CONNECT BY PRIOR column_name =...

    oracle10g创建用户名和表空间

    在Oracle 10g数据库系统中,创建表空间和用户是一项基本但非常重要的任务。这不仅涉及到数据存储的管理,还关系到数据库的安全性和性能优化。下面将详细介绍如何在Oracle 10g环境中创建表空间、临时表空间以及用户,...

    oracle 创建用户

    通过以上步骤,我们可以快速地在Oracle 10g环境中创建并配置新用户。创建用户时需要注意指定合适的表空间,并合理分配权限。此外,利用DMP文件可以方便地迁移数据。这些步骤对于Oracle数据库的日常管理和维护至关...

    Oracle相关技术-解决忘记oracle管理员密码,创建只读用户语法等

    例如,如果想从表中随机选取10%的数据,可以创建一个伪列并按该列进行排序,然后使用`LIMIT`或子查询来获取前10%的行。 最后,关于“TOAD导入数据库方法”,TOAD是一款强大的Oracle数据库管理工具。导入数据的步骤...

    sql语法大全oracle文档

    - 排序查询:`SELECT * FROM 表名 ORDER BY 列名 ASC/DESC;` - 分组查询:`SELECT 列名 FROM 表名 GROUP BY 列名;` - 联合查询:`SELECT * FROM 表1 UNION SELECT * FROM 表2;` 5. 更新与删除数据: - 更新数据...

    oracle常用语法

    在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数据库是全球领先的数据库管理系统之一,其强大而灵活的数据管理功能在企业级应用中占据重要地位。本文将深入探讨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数据库中的应用.pdf

    Oracle通过START WITH子句指定层次数据的根节点,即查询的起始行,而CONNECT BY子句则用来定义父节点与子节点之间的关系。 层次查询的五个基本步骤如下: 1. 从数据表中选取满足START WITH条件的数据行作为根节点...

    oracle日常语法

    在Oracle 11g数据库管理中,日常语法的掌握对于高效操作数据库至关重要。本文将深入解析从给定文件中提取的Oracle日常语法知识点,包括表空间管理、数据文件操作、日志文件管理、用户权限授予以及备份恢复策略,旨在...

    oracle-use.rar_Oracle drop use_oracle

    "按照当前层次级别排序"可能是指在层次查询中使用`CONNECT BY`和`PRIOR`关键字,这在处理树形结构的数据时非常有用。例如,`SELECT * FROM table START WITH condition CONNECT BY PRIOR id = parent_id ORDER ...

Global site tag (gtag.js) - Google Analytics