|
原帖由 newkid 于 2008-7-14 10:41 发表 ![]()
稍微改了一下,你帮我验证吧:
SELECT CHILD
,SUM(C_QTY) AS C_QTY -- 解决叶子(原料)不唯一
FROM (SELECT CHILD
,(SELECT POWER(10,SUM(LOG(10,C_QTY)))/POWER(10,SUM(LOG(10,P_QTY)))
FROM BOM
CONNECT BY PRIOR PARENT=CHILD
START WITH CHILD = inner.CHILD -- 从每个叶子开始
AND PARENT = inner.PARENT -- 解决叶子(原料)不唯一
) AS C_QTY
FROM (SELECT b.*
FROM BOM b
WHERE NOT EXISTS (SELECT 1 FROM BOM WHERE parent = b.child) --解决 9i 没有CONNECT_BY_ISLEAF
CONNECT BY PRIOR CHILD = PARENT
START WITH PARENT='A'
) inner
)
GROUP BY CHILD;
ORACLE9204下测试顺利通过,结果是对的.
INSERT INTO BOM VALUES ('A','B',1,3);
INSERT INTO BOM VALUES ('B','C',2,3);
INSERT INTO BOM VALUES ('C','D',5,6);
INSERT INTO BOM VALUES ('D','E',1,2);
INSERT INTO BOM VALUES ('A','Z',1,3);
insert into BOM values('D','Z',1,4);
select * from bom
SELECT CHILD
,SUM(C_QTY) AS C_QTY -- ½â¾öÒ¶×Ó£¨Ô ÁÏ£©²»Î¨Ò»
FROM (SELECT CHILD
,(SELECT POWER(10,SUM(LOG(10,C_QTY)))/POWER(10,SUM(LOG(10,P_QTY)))
FROM BOM
CONNECT BY PRIOR PARENT=CHILD
START WITH CHILD = inner.CHILD -- ´Óÿ¸öÒ¶×Ó¿ªÊ¼
AND PARENT = inner.PARENT -- ½â¾öÒ¶×Ó£¨Ô ÁÏ£©²»Î¨Ò»
) AS C_QTY
FROM (SELECT b.*
FROM BOM b
WHERE NOT EXISTS (SELECT 1 FROM BOM WHERE parent = b.child) --½â¾ö 9i ûÓÐCONNECT_BY_ISLEAF
CONNECT BY PRIOR CHILD = PARENT
START WITH PARENT='A'
) inner
)
GROUP BY CHILD
RETURN:
E 10.8 --(3*3/2*6/5*2)
Z 24.6 --(3*3/2*6/5*4+3)
谢谢NEWKID |
|