|
如果你用的是11.2以上版本,可以用递归WITH更加简单:
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
),
t(root,parent,child,qty) AS (
SELECT parent as root,parent,child,c_qty/p_qty qty from bom1 where PARENT IN ('a','a1')
UNION ALL
SELECT t.root,b.parent,b.child,t.qty*b.c_qty/b.p_qty
FROM bom1 b,t
WHERE t.child=b.parent
)
SELECT root,child,SUM(qty)
FROM t
WHERE NOT EXISTS (SELECT 1 FROM bom1 b WHERE b.parent = t.child)
GROUP BY root,child
|
|