网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  如何在oracle层次查询中给siblings排序     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:84次  录入:管理员--2008-04-28  
 

【赛迪网-it技术报道】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 10g中scn与timestamp的斗转星移    下一篇: 详细讲解oracle在solaris下的性能与调整 (1)
  相关文档
Oracle中查找和删除重复记录方法简介 04-11
进行logmnr操作时发现空列名的具体原因 02-27
讲解数据仓库实施过程所需要考虑的步骤 02-20
细化解析Oracle 10g STATSPACK的新功能 08-05
数据库迁移的几种常用方式及优缺点比较 05-14
讲解oracle数据库ora-00257故障的解决过程 (1) 07-15
Oracle系统表查询 01-15
“数字公交”项目中的Oracle开发技巧 05-27
oracle数据库中如何建立二进制文件索引 (1) 03-24
两个不容易理解的概念──user和schema 03-05
讲解oracle中job与存储过程的接合用法 03-13
Oracle中用LogMiner分析重做及归档日志 04-11
排除cache影响手动强制刷新buffer cache 05-27
教你通过sql语句获取数据库的基本信息 07-29
理解和使用Oracle分析工具-LogMiner 06-10
oracle数据库内存参数调优技术的个人总结 (1) 05-07
如何使用new_value将查询结果传递给变量 04-10
解析:学习oracle架构应当掌握哪些知识 (1) 11-20
oracle最强有力的辅助诊断工具sql_trace (1) 04-30
拨云见日 正确认识password file的作用 (1) 04-24
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息