Wil*_*ett 14 sql oracle recursion rdms
我有一个递归查询,它确实扩展了这个Java猴子SQL知识的限制.现在它终于凌晨1点半了,现在可能是时候开始寻求帮助了.这是谷歌失败的少数几次之一.
表格如下:
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
Run Code Online (Sandbox Code Playgroud)
我正在尝试获得以下结果,其中父项列出了下面的每个子项.注意qty的级联也是如此.
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
Run Code Online (Sandbox Code Playgroud)
我尝试过以下几种偏差无济于事.
SELECT *
FROM MD_BOMS
START WITH PARENT_ID is not null
CONNECT BY PRIOR CHILD_ID = PARENT_ID
ORDER BY PARENT_ID, CHILD_ID
Run Code Online (Sandbox Code Playgroud)
我正在使用Oracle数据库.任何建议,想法等将不胜感激.这似乎很接近,但我不确定这是否是我正在寻找的:检索所有孩子及其子女,递归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
Run Code Online (Sandbox Code Playgroud)
Ale*_*ole 14
你很近:
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
Run Code Online (Sandbox Code Playgroud)
该connect_by_root运营商为您提供了基础parent_id.
我不确定你是如何计算你的qty.我猜你想要孩子的路径总数,但这与你所展示的不符.作为一个起点,那么,借款非常从重这个答案,你可以尝试这样的:
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
Run Code Online (Sandbox Code Playgroud)
@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
Run Code Online (Sandbox Code Playgroud)
SQLFiddle示例(扩展了一个数据行以演示超过2个级别的工作)
| 归档时间: |
|
| 查看次数: |
45176 次 |
| 最近记录: |