Oracle排序按层次关联
我有一个定义了父/子关系的表,但是没有办法通过层次结构进行排序。
For example consider this:
empid managerid name
js hd George
hd ab Mary
hs js Tom
ab xx John
因为我不能使用ORDER SIBLINGS BY以分层方式进行排序,所以我如何能够按照下面的分层方式对它进行排序?
empid managerid name
ab xx John
hd ab Mary
js hd George
hs js Tom
向我们展示迄今为止您尝试的查询会很有帮助。 这听起来似乎有某种误解。
对于您的非常小的样本数据Eng. Samer T
Eng. Samer T
的答案是正确的。 您不需要order by
条款order by
。 Oracle保证行将在connect by
查询connect by
的层次结构中返回。 关于分层查询的Oracle文档:
不能保证的是同一层级(同级)内的行将被排序。 但是因为你的样本数据在每个级别只有一个孩子,所以这没有关系。
但是,让我们考虑一个更多数据的例子,以便我们有兄弟姐妹。
create table Employee (
empid varchar2(50) not null,
managerid varchar2(50) not null,
name varchar2(50) not null
)
/
insert into Employee (empid, managerid, name) values ('js', 'hd', 'George');
insert into Employee (empid, managerid, name) values ('hd', 'ab', 'Mary');
insert into Employee (empid, managerid, name) values ('hs', 'js', 'Tom');
insert into Employee (empid, managerid, name) values ('ww', 'js', 'Waldo');
insert into Employee (empid, managerid, name) values ('ab', 'xx', 'John');
insert into Employee (empid, managerid, name) values ('ab2', 'xx', 'Other manager');
insert into Employee (empid, managerid, name) values ('st', 'ab2', 'Stan');
insert into Employee (empid, managerid, name) values ('lee', 'ab2', 'Lee');
alter table employee
add constraint employee_pk
primary key (empid)
/
如果我然后connect by
查询运行以下connect by
而不需要order by
子句:
select t.*, level
from employee t
start with t.managerid = 'xx'
connect by prior t.empid = t.managerid
我得到(SqlFiddle):
empid managerid name level
----- --------- ---- -----
ab xx John 1
hd ab Mary 2
js hd George 3
hs js Tom 4
ww js Waldo 4
ab2 xx Other manager 1
lee ab2 Lee 2
st ab2 Stan 2
注意层次结构是如何被尊重的,这是有保证的。 但是,对于兄弟姐妹,订单不能保证。 例如,不能保证John
将永远在Other manager
之前上市, Tom
将在Waldo
之前上市,或者Lee
将在Stan
之前上市。
如果你想保证在兄弟姐妹中的排序,但不破坏层次结构的顺序,这正是order siblings by
子句order siblings by
。
所以我不知道你为什么说:
我无法使用ORDER SIBLINGS BY
以分层方式进行排序
因为,关于分层查询的Oracle文档几乎说明了相反的情况:
在分层查询中,不要指定ORDER BY
或GROUP BY
,因为它们将覆盖CONNECT BY
结果的层次顺序。 如果您想要对同一父级的同级行进行排序,请使用ORDER SIBLINGS BY
子句。
注意它是如何特别推荐使用order siblings by
来排序兄弟姐妹而不破坏结果的等级顺序。
假设我希望我的结果按层次顺序排列,但是按照降序名称按字母顺序排序。 然后我可以调整我以前的查询来:
select t.*, level
from employee t
start with t.managerid = 'xx'
connect by prior t.empid = t.managerid
order siblings by name desc
我的结果变成(SqlFiddle):
empid managerid name level
----- --------- ---- -----
ab2 xx Other manager 1
st ab2 Stan 2
lee ab2 Lee 2
ab xx John 1
hd ab Mary 2
js hd George 3
ww js Waldo 4
hs js Tom 4
注意层次结构仍然受到尊重。 但兄弟姐妹John
和Other manager
被重新排序,以便Other manager
的整个结果树列在John
之前。 而且, Waldo
现在总是会出现在Tom
面前,而Stan
总是会出现在Lee
前。
默认的“connect by”子句将返回结果。
从头开始,我假设'xx'表示没有经理。
select t.*, t.rowid from emp_table t
start with managerid = 'xx'
connect by prior empid = managerid
感谢所有....水平的ORDER给了我想要的结果。 我不知道Oracle已经定义了级别。
链接地址: http://www.djcxy.com/p/93919.html