How to retrieve all recursive children of parent row in Oracle SQL?

后端 未结 2 679
温柔的废话
温柔的废话 2021-01-31 21:20

I\'ve got a recursive query that\'s really stretching the limits of this Java monkey\'s SQL knowledge. Now that it\'s finally 1:30 in the AM, it\'s probably time to start looki

2条回答
  •  北海茫月
    2021-01-31 21:47

    You are close:

    select connect_by_root parent_id base, parent_id, child_id, qty
    from md_boms
    connect by prior child_id = parent_id
    order by base, parent_id, child_id;
    
              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          2 
                25         27         31          1 
                25         27         32          1 
                25         27         33          2 
                26         26         28          1 
                26         26         29          1 
                26         26         30          2 
                27         27         31          1 
                27         27         32          1 
                27         27         33          2 
    
         14 rows selected 
    

    The connect_by_root operator gives you the base parent_id.

    SQL Fiddle.

    I'm not sure how you're calculating your qty. I'm guessing you want the total for the path to the child, but that doesn't match what you've shown. As a starting point, then, borrowing very heavily from this answer, you could try something like:

    with hierarchy as (
      select connect_by_root parent_id base, parent_id, child_id, qty,
        sys_connect_by_path(child_id, '/') as path
      from md_boms
      connect by prior child_id = parent_id
    )
    select h.base, h.parent_id, h.child_id, sum(e.qty)
    from hierarchy h
    join hierarchy e on h.path like e.path ||'%'
    group by h.base, h.parent_id, h.child_id
    order by h.base, h.parent_id, h.child_id;
    
         BASE  PARENT_ID   CHILD_ID SUM(E.QTY)
    ---------- ---------- ---------- ----------
            25         25         26          1 
            25         25         27          2 
            25         26         28          2 
            25         26         29          2 
            25         26         30          3 
            25         27         31          3 
            25         27         32          3 
            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 
    
     14 rows selected 
    

提交回复
热议问题