设为首页 收藏本站
查看: 614|回复: 0

[经验分享] ORACLE 10G新语法CONNECT BY层内排序

[复制链接]
YunVN网友  发表于 2016-8-14 06:13:18 |阅读模式
  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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-257259-1-1.html 上篇帖子: unknown Oracle major version 异常的解决方案 下篇帖子: Oracle 中的 dual 表是干什么的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表