如何在Oracle层次查询中给SIBLINGS排序(转自开发者在线)

Oracle SELECT语句中的START WITH和CONNECT BY子句自动阻断一个层次。缺少这项特性,就需要一个复杂的自联接来确定行之间的逻辑联系。START WITH子句指定被认为是层次起点,或“根”的一行或几行。然后CONNECT BY PRIOR子句指明哪些行彼此关联。

例如,列表A中的查询从Oracle HR样本模式的EMPLOYEES表中生成一个“Reports To”列表。

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前后的输出结果。

Bob Watkins(OCP、MCDBA、MCSE、MCT)是一位有25年经验的计算机专业人士,从事过技术培训师、顾问与数据库管理员等职。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值