2011-02-08 2 views
1

В DB2 SQL У меня есть таблица, которая содержит 3 столбца: parent_id, id и count. Это таблица иерархии. Мне нужен рекурсивный запрос, чтобы получить все листовые узлы и их общий счет, а также другой запрос, чтобы получить все листовые узлы и их общее количество плюс стоимость каждого узла (цена сохранена в другой таблице (id, price))Как получить узлы листа рекурсивным запросом в 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) 

Это даст вам все листовые узлы, и тогда это просто вопрос добавления в подсчеты и объединение, чтобы получить необходимую информацию.

Надеюсь, что это поможет!