我有一个递归查询,它实际上扩展了此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
@AlexPoole的答案很棒,我只想用更直观的查询变体扩展他的答案,以便沿路径求和。 此变体基于 递归子查询分解功能,已在中引入Oracle 11g R2。
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示例(扩展了一个数据行以演示多于两个级别的工作)