【问题标题】:sql nested query - group results by parentsql嵌套查询-按父级分组结果
【发布时间】:2011-05-25 09:35:54
【问题描述】:

我需要从单个表中返回树状结果。目前我使用 connect by 和 start with 以确保返回所有正确的结果。

select id,parent_id
     from myTable 
 connect by prior id = parent_id start with name = 'manager' 
     group by id, parent_id
 order by parent_id asc

但是我希望结果以树结构返回。因此,每次找到父行时,其子行将直接显示在其下方。然后移动到下一个父母并做同样的事情

预期结果

  - Parent A
   - child a
   - child b 
  - Parent B
   - child c
   - child d 

实际结果

- Parent A 
- Parent B
- child a 
- child b 
- child c 
- child d

在 oracle 中可以做到这一点吗?我的表使用 parent_id 字段来识别行何时有父级。每行也有一个排序顺序,这是它应该在其父级下排序的顺序和一个唯一的 Id。

我正在使用 Oracle 数据库

【问题讨论】:

    标签: sql oracle nested


    【解决方案1】:

    你想要的是使用ORDER SIBLINGS BY。您的查询按parent_id 列排序,该列覆盖任何层次排序。

    下面的查询应该做你需要做的事情:

    with my_hierarchy_data as (
      select 1 as id, null as parent_id, 'Manager' as name from dual union all
      select 2 as id, 1 as parent_id, 'parent 1' as name from dual union all
      select 3 as id, 1 as parent_id, 'parent 2' as name from dual union all
      select 4 as id, 2 as parent_id, 'child 1' as name from dual union all
      select 5 as id, 2 as parent_id, 'child 2' as name from dual union all
      select 6 as id, 3 as parent_id, 'child 3' as name from dual union all
      select 7 as id, 3 as parent_id, 'child 4' as name from dual 
    )
    select id, parent_id, lpad('- ', level * 2, ' ') || name as name
    from my_hierarchy_data
    connect by prior id = parent_id
    start with name= 'Manager'
    order siblings by parent_id asc
    

    【讨论】:

    • 制表符不是必需的,所以我也可以删除 lpad,只使用选择 ID、父 ID、级别、名称。它可以按要求工作。谢谢
    【解决方案2】:

    有一个特殊值level 可用于Oracle 分层查询。它为层次结构顶层的行返回 1,为其子行返回 2,依此类推。您可以使用它来创建这样的缩进:

    select lpad('- ',level*2,' ') || name
         from myTable 
     connect by prior id = parent_id start with name = 'manager' 
         group by id, parent_id
    

    【讨论】:

    • 谢谢托尼,我是否需要在选择中返回每个字段?我得到一个“不是按表达式分组”。关于这一点的更多背景信息。我将结果传递回 Java 应用程序,该应用程序期望结果已经排序,以便显示。谢谢
    • 抱歉,我没有注意到 GROUP BY。我猜只是改为“按 lpad('- ',level*2,' ') || name 分组”?
    • 查询不只是以与刚才完全相同的顺序显示结果,并根据层次结构中的级别使用选项卡
    • 我不知道你所说的“标签”是什么意思?您需要摆脱 ORDER BY 才能获得分层排序。
    • 抱歉,我应该在描述中更清楚。感谢您提供有用的反馈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多