2011-02-08 72 views
1

在DB2 SQL中,我有一個包含3列的表:parent_id,idcount。它是一個層次表。我需要一個遞歸查詢來獲取所有葉節點和它們的總數,另一個查詢獲得所有葉節點及其總數加上每個節點的成本(存儲在另一個表中的價格(idprice))如何通過db2中的遞歸查詢獲取葉節點?

我嘗試這樣做查詢,但沒有奏效:

with COMP_P (COMPONENT,SUBCOMPONENT,SUBCOMPCOUNT) as (
(select C.COMPONENT,C.SUBCOMPONENT,C.SUBCOMPCOUNT from COMPS C WHERE C.COMPONENT = 'A') 
UNION ALL 
(SELECT P.COMPONENT,C.SUBCOMPONENT,C.SUBCOMPCOUNT * P.SUBCOMPCOUNT from COMPS C,COMP_P P WHERE P.SUBCOMPONENT = C.COMPONENT)) 
SELECT COMPONENT,SUBCOMPONENT,sum(SUBCOMPCOUNT) As Count FROM COMP_P group by COMPONENT,SUBCOMPONENT ; 

它給我的葉節點等。我想這對於第二部分:

with COMP_P (COMPONENT,SUBCOMPONENT,SUBCOMPCOUNT) as (
(select C.COMPONENT,C.SUBCOMPONENT,C.SUBCOMPCOUNT from COMPS C WHERE C.COMPONENT = 'A') 
UNION ALL 
(SELECT P.COMPONENT,C.SUBCOMPONENT,C.SUBCOMPCOUNT * P.SUBCOMPCOUNT from COMPS C,COMP_P P WHERE P.SUBCOMPONENT = C.COMPONENT)) 
SELECT COMPONENT,SUBCOMPONENT,sum(SUBCOMPCOUNT) As Count,sum(SUBCOMPCOUNT) * partcosts.cost FROM COMP_P,partcosts where partcosts.partid.id=COMP_P.SUBCOMPONENT group by COMPONENT,SUBCOMPONENT ; 

回答

1

如果你只是試圖讓葉節點,你不應該需要做遞歸查詢 - 你可以檢查孩子的存在:

SELECT * FROM table AS t1 WHERE NOT EXISTS (SELECT * FROM table AS t2 WHERE t2.parent_id = t1.id) 

這會給你所有的葉節點,然後它只是一個添加計數和聯接以獲取所需信息的問題。

希望有幫助!