|
你这个已经是图不是树了,应该用路径去匹配:
WITH bom1 AS( SELECT 'a' PARENT, 'b' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
SELECT 'b' PARENT, 'c' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
SELECT 'b' PARENT, 'g' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
SELECT 'c' PARENT, 'd' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
SELECT 'a' PARENT, 'e' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
SELECT 'e' PARENT, 'b' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
SELECT 'e' PARENT, 'f' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
SELECT 'a' PARENT, 'h' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
SELECT 'a1' PARENT,'b' CHILD, 1 P_QTY, 2 C_QTY FROM dual
),
vw_bom AS (SELECT b.*,CONNECT_BY_ROOT(parent) AS ROOT,sys_connect_by_path(child,',') as path
FROM bom1 b
CONNECT BY PRIOR CHILD = PARENT
START WITH PARENT IN ('a','a1')
)
SELECT ROOT,CHILD,SUM(C_QTY) FROM (
SELECT ROOT
,CHILD
,(SELECT POWER(10,SUM(LOG(10,C_QTY)))/POWER(10,SUM(LOG(10,P_QTY)))
FROM vw_bom
CONNECT BY PRIOR PATH=path||','||PRIOR CHILD AND ROOT = inner.ROOT
START WITH PATH = inner.PATH -- 从每个叶子开始
--AND PARENT = inner.PARENT -- 解决叶子(原料)不唯一
AND ROOT = inner.ROOT
) AS C_QTY
FROM vw_bom inner
WHERE NOT EXISTS (SELECT 1 FROM vw_bom WHERE parent = inner.child)
)
GROUP BY ROOT,CHILD
|
|