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文档:

  • Oracle按照图9-1所示的顺序返回行。 在图中, 孩子出现在父母的下方
  • 不能保证的是同一层级(同级)内的行将被排序。 但是因为你的样本数据在每个级别只有一个孩子,所以这没有关系。


    但是,让我们考虑一个更多数据的例子,以便我们有兄弟姐妹。

    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 BYGROUP 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
    

    注意层次结构仍然受到尊重。 但兄弟姐妹JohnOther 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

    上一篇: Oracle sorting connect by prior hierarchically

    下一篇: unstack hierarchical data