2016-02-15 182 views
0

在層次結構查詢中需要幫助,我有兩個表,一個保存元素之間的層次結構,第二個保存每個元素的活動警報。層次結構查詢 - 聚合節點

create table hrc (parent_id number, child_id number); 
insert into hrc (parent_id,child_id) values (null,1); 
insert into hrc (parent_id,child_id) values (1,2); 
insert into hrc (parent_id,child_id) values (2,0); 
insert into hrc (parent_id,child_id) values (0,76292); 
insert into hrc (parent_id,child_id) values (0,96689); 
insert into hrc (parent_id,child_id) values (0,12429); 
insert into hrc (parent_id,child_id) values (0,10697); 
insert into hrc (parent_id,child_id) values (0,60856); 
insert into hrc (parent_id,child_id) values (0,99460); 
insert into hrc (parent_id,child_id) values (76292,57120); 
insert into hrc (parent_id,child_id) values (12429,25152); 


commit 
/
create table alarms (id number,element_id number) ; 

insert into alarms (id,element_id) values (1,0); 
insert into alarms (id,element_id) values (2,0); 
insert into alarms (id,element_id) values (3,0); 
insert into alarms (id,element_id) values (4,76292); 
insert into alarms (id,element_id) values (5,76292); 
insert into alarms (id,element_id) values (6,57120); 
insert into alarms (id,element_id) values (7,57120); 
insert into alarms (id,element_id) values (8,57120); 
insert into alarms (id,element_id) values (9,25152); 
insert into alarms (id,element_id) values (10,25152); 
insert into alarms (id,element_id) values (11,12429); 
commit; 

下一個查詢是分層結構

with q (parent_id,child_id, hierlevel,root) as 
( 
select parent_id,child_id, 0,child_id root 
from hrc 
where parent_id = 0 
UNION ALL 
select hrc.parent_id,hrc.child_id ,q.hierlevel + 1 , q.root 
     from hrc 
     join 
     q 
     on (q.child_id=hrc.parent_id) 

)select * from q 

我想加入(左外),以報警表,每位元素,但只是爲了例如第一級alrams的計數,對於選擇PARENT_ID = 0 所需輸出爲:

COUNT ROOT


    5  76292 
        3  12429 
        0  60856 
        0  10697 
        0  99460 
        0  96689 

元素76292(5) - 他的自己和他的孩子(57120)的警報3有2。 12429(3) - 他自己的1和他的孩子2。 其餘有0個警報。

首選的方法是使用CTE,而不是通過連接。

感謝您的幫助。

回答

1

你不能在遞歸CTE內部進行連接/聚合 - 你會得到ORA-32486:不支持的操作錯誤。

你可以保持您的CTE,因爲它是和剛剛加入,要報警表,並從根本上ID組:

with a as (...) 
select q.root, count(a.id) 
from q 
left join alarms a on a.element_id = q.child_id 
group by q.root 
order by count(a.id) desc; -- or whatever 

     ROOT        COUNT(A.ID) 
---------- --------------------------------------- 
    76292          5 
    12429          3 
    99460          0 
    10697          0 
    96689          0 
    60856          0 
+0

感謝您的幫助,它的工作原理。 – TheRunningDBA