小编典典

如何在Oracle SQL中检索父行的所有递归子级?

sql

我有一个递归查询,它实际上扩展了此Java猴子的SQL知识的范围。现在已经是上午1:30了,现在该是时候开始寻求帮助了。这是Google失败我的几次机会之一。

下表如下:

Parent_ID CHILD_ID QTY
25        26        1
25        27        2
26        28        1
26        29        1
26        30        2
27        31        1
27        32        1
27        33        2

我正在尝试获得以下结果,其中父母在其下面列出了每个孩子。注意,数量也是级联的。

BASE    PARENT_ID  CHILD_ID   QTY
25         25        26        1
25         25        27        2
25         26        28        1
25         26        29        1
25         26        30        1
25         27        31        2
25         27        32        2
25         27        33        4
26         26        28        1
26         26        29        1
26         26        30        2
27         27        31        1
27         27        32        1
27         27        33        2

我已经尝试了以下几种偏差,但均无济于事。

SELECT *
FROM MD_BOMS
START WITH PARENT_ID is not null
CONNECT BY PRIOR CHILD_ID = PARENT_ID
ORDER BY PARENT_ID, CHILD_ID

我正在使用Oracle数据库。任何建议,想法等,将不胜感激。这似乎很接近,但是我不确定这是否是我要寻找的:检索所有Child及其子级,递归SQL

基于检索所有子级及其子级,递归SQL,我也尝试了以下操作,但收到“在WITH子句中查询名称的非法引用”错误:

with cte as (
    select  CHILD_ID, PARENT_ID, CHILD_ID as head
    from    MD_BOMS
    where   PARENT_ID is not null
    union all
    select  ch.CHILD_ID, ch.PARENT_ID, p.head
    from    MD_BOMS ch
    join    cte pa
    on      pa.CHILD_ID = ch.PARENT_ID
)
select  *
from    cte

阅读 164

收藏
2021-04-15

共1个答案

小编典典

@AlexPoole的答案很棒,我只想用更直观的查询变体扩展他的答案,以便沿路径求和。
此变体基于
递归子查询分解功能,已在中引入Oracle 11g R2

with recursion_view(base, parent_id, child_id, qty) as (
   -- first step, get rows to start with
   select 
     parent_id base, 
     parent_id, 
     child_id, 
     qty
  from 
    md_boms

  union all

  -- subsequent steps
  select
    -- retain base value from previous level
    previous_level.base,
    -- get information from current level
    current_level.parent_id,
    current_level.child_id,
    -- accumulate sum 
    (previous_level.qty + current_level.qty) as qty 
  from
    recursion_view previous_level,
    md_boms        current_level
  where
    current_level.parent_id = previous_level.child_id

)
select 
  base, parent_id, child_id, qty
from 
  recursion_view
order by 
  base, parent_id, child_id

SQLFiddle示例(扩展了一个数据行以演示多于两个级别的工作)

2021-04-15