【问题标题】:Defining the sort order of children in a hierarchy query在层次结构查询中定义子项的排序顺序
【发布时间】:2012-10-31 09:40:12
【问题描述】:

我想知道按 sequence_within_parent 列对层次结构查询中的子项进行排序的 Oracle SQL 查询。

一个示例数据集和查询是:

create table tasks (task_id                 number
                    ,parent_id               number
                    ,sequence_within_parent number
                    ,task                    varchar2(30)
                    );
insert into tasks values ( 1, NULL, 0, 'Task 1');
insert into tasks values ( 2,    1, 1, 'Task 1.1');
insert into tasks values ( 3,    1, 2, 'Task 1.2');
insert into tasks values ( 4,    2, 2, 'Task 1.1.2');
insert into tasks values ( 5,    3, 1, 'Task 1.2.1');
insert into tasks values ( 6,    2, 1, 'Task 1.1.1');
insert into tasks values ( 7,    3, 4, 'Task 1.2.4');
insert into tasks values ( 8,    3, 2, 'Task 1.2.2');
insert into tasks values ( 9,    3, 3, 'Task 1.2.3');
insert into tasks values (10 ,   2, 3, 'Task 1.1.3');

column task format a30

select task_id
      ,sequence_within_parent
      ,lpad(' ', 2 * (level - 1), ' ') || task task
from   tasks
connect by parent_id = prior task_id
start with task_id = 1
/

此查询返回以下内容:

   TASK_ID SEQUENCE_WITHIN_PARENT TASK
---------- ---------------------- ---------------
         1                      0 Task 1
         2                      1   Task 1.1
         4                      2     Task 1.1.2
         6                      1     Task 1.1.1
        10                      3     Task 1.1.3
         3                      2   Task 1.2
         5                      1     Task 1.2.1
         7                      4     Task 1.2.4
         8                      2     Task 1.2.2
         9                      3     Task 1.2.3

首选输出低于子项的正确顺序:

   TASK_ID SEQUENCE_WITHIN_PARENT TASK
---------- ---------------------- ---------------
         1                      0 Task 1
         2                      1   Task 1.1
         6                      1     Task 1.1.1
         4                      2     Task 1.1.2
        10                      3     Task 1.1.3
         3                      2   Task 1.2
         5                      1     Task 1.2.1
         8                      2     Task 1.2.2
         9                      3     Task 1.2.3
         7                      4     Task 1.2.4

【问题讨论】:

    标签: sql oracle sql-order-by hierarchy


    【解决方案1】:

    要添加到查询的子句是“ORDER SIBLINGS BY SEQUENCE_WITHIN_PARENT”。

    在层次结构中,所有子节点或子节点都称为兄弟节点。

    示例数据集的完整查询是:

    select rownum
          ,task_id
          ,sequence_within_parent
          ,lpad(' ', 2 * (level - 1), ' ') || task  task
    from   tasks
    connect by parent_id = prior task_id
    start with task_id = 1
    order siblings by sequence_within_parent
    /
    

    【讨论】:

    • 在非常简单的查询中,ORDER SIBLINGS BY 可能会起作用。 asktom.oracle.com/pls/apex/… 有一些查询(先前的双重连接)不会。它也没有给你很大的灵活性,而使用零填充字符串会。如果你使用 Oracle >= 9i 没关系,但那时 connect siblings by 不存在
    • 你可以在x之后接受你自己的答案吗?小时并获得声望点。也公平地投票给其他答案,给你一个新的观点。祝大家好运。
    【解决方案2】:

    SQL Server 有一个hierarchyID 类型可以很好地处理这个问题。对于所有其他 RDBMS,我通常使用如下的字符串连接仿真。

    select task_id
          ,sequence_within_parent
          ,lpad(' ', 2 * (level - 1), ' ') || task task
          ,SYS_CONNECT_BY_PATH(
            to_char(parent_id, 'FM000000000')
            ||
            to_char(sequence_within_parent, 'FM000000000')
            ,'/') hier
    from   tasks
    connect by parent_id = prior task_id
    start with task_id = 1
    order by hier;
    

    【讨论】:

    • 感谢您对主题的出色改动。为了完成我要添加的初始请求。 “列hier noprint”。
    • Oracle 文档中的注释:“在分层查询中,不要指定 ORDER BY 或 GROUP BY,因为它们会破坏 CONNECT BY 结果的层次顺序。如果您想对同级的行进行排序同一个父母,然后使用 ORDER SIBLINGS BY 子句。”看到这个页面的一半docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm
    猜你喜欢
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多