2014-02-20 62 views
-1

對不起,如果這個問題已經被問到。請重定向我。PL-SQL TREE MAX VALUE ROLLUP

對不起,如果它被擱置。
只是爲了澄清我的問題。

這是我的細節。

我有1個名爲T1的視圖,它有3列名爲ID(NUM),PARENT_ID(NUM)和COLOR(NUM)的列。

* ID列是列PARENT_ID的子
*顏色列ID列的分配的顏色(4000最高,3000,2000,1000最低)
*與ID行1和父ID 0是最高級/根級別。
*我沒有ID爲0的行;

我的問題是,我不知道如何:
1.根據其孩子的最高顏色值更改父顏色。
例如:id爲2的行必須是4000色(4000 [行ID 4]> 3000 [行ID 5])。
2.接下來,根據父母的最高顏色也改變祖父母的顏色。如果盛大的父母存在,那麼它也必須按照父母最高的顏色更新。

ID parent ID  color 
1  0    1000 
2  1    1000 
3  1    2000 
4  2    4000 
5  2    3000 

輸出應該是。

id color 
1 4000 
2 4000 
3 2000 
4 4000 
5 3000 

我正在使用Oracle 11g。

另請注意,我的T1視圖也是使用Connect By加入的多個表的結果。我已經設法使用「連接方式」獲得最大顏色,但它僅反映其直接父級顏色,而不反映其父級顏色。

請諮詢..

+2

你能澄清什麼是你想要的,你是如何在你需要的輸出獲得的「顏色」的價值觀?從提供的樣本輸出中我不清楚。什麼是「終極父母」?那個ID是0嗎?如果是這樣,爲什麼它沒有列在你的表中?如果不是,它是什麼? –

+0

我已經設法得到兒童的最大顏色,但它只反映了它的直接父母,而不是它的盛大父母的顏色。我試圖使用遞歸只是爲了更新盛大的父母顏色,但它太慢 –

+0

我已經使用Gaurav Soni的建議,它的工作原理。 –

回答

0
WITH tab 
     AS (SELECT 1 AS ID, 0 AS parent_ID, 1000 AS color FROM DUAL 
      UNION 
      SELECT 2 AS ID, 1 AS parent_ID, 1000 AS color FROM DUAL 
      UNION 
      SELECT 3 AS ID, 1 AS parent_ID, 2000 AS color FROM DUAL 
      UNION 
      SELECT 4 AS ID, 2 AS parent_ID, 4000 AS color FROM DUAL 
      UNION 
      SELECT 5 AS ID, 2 AS parent_ID, 3000 AS color FROM DUAL) 
     SELECT temp_id id, MAX (color) color 
     FROM ( SELECT id, 
         parent_id, 
         color, 
         CONNECT_BY_ROOT id temp_id 
        FROM tab 
       CONNECT BY PRIOR id = parent_id) 
    GROUP BY temp_id 
    ORDER BY 1 ASC; 

     ID  COLOR 
---------- ---------- 
    1  4000 
    2  4000 
    3  2000 
    4  4000 
    5  3000 

5 rows selected. 
+0

哇!那很快。非常感謝, 我已經浪費了兩天的時間思考如何處理它,並已經在混合遞歸和連接的過程中。呵呵 再次謝謝你.. !!!雖然 –

+0

又一個簡單的問題,爲什麼你被點名了id作爲ID的 TEMP_ID 代替 ID TEMP_ID SELECT子句 –

+0

在@seigfred Mondez:反黑組的別名ID,它行動組,JST想有兩個ID之間diffetentiate –