快捷搜索:

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

是以在查询结尾处增添下面这个子句:

ORDER SIBLINGS BY last_name

将会保护层次,并在每个等级中以字母顺序排列雇员的姓。留意最初的last_name用作“Reports To”的又名。“Reports To”中的额外空间会影响排序,是以必须应用最初的last_name。列表B中是增添ORDER SIBLINGS BY前后的输出结果。

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

/

SQL> @siblings_without_orderby

Reports ToEMPLOYEE_ID

------------------------------ -----------

Kochhar101

Whalen200

Mavris203

Baer204

Higgins205

Gietz206

Greenberg108

Faviet109

Chen110

Sciarra111

Urman112

Popp113

De Haan102

Hunold103

Ernst104

Austin105

Pataballa106

Lorentz107

18 rows selected.

SQL> @siblings_with_orderby

Reports ToEMPLOYEE_ID

------------------------------ -----------

De Haan102

Hunold103

Austin105

Ernst104

Lorentz107

Pataballa106

Kochhar101

Baer204

Greenberg108

Chen110

Faviet109

Popp113

Sciarra111

Urman112

Higgins205

Gietz206

Mavris203

Whalen200

18 rows selected.

SQL>

Bob Watkins(OCP、MCDBA、MCSE、MCT)是一位有25年履历的谋略机专业人士,从事过技巧培训师、顾问与数据库治理员等职。

您可能还会对下面的文章感兴趣: