PL-SQL TREE MAX VALUE ROLLUP

时间:2014-02-20 09:05:14

标签: sql oracle connect-by

很抱歉,如果已经提出这个问题。请重定向我。

抱歉,如果它处于暂停状态。
只是为了澄清我的问题。

这是我的详细信息。

我有1个名为T1的视图,它有3列名为ID(NUM),PARENT_ID(NUM)和COLOR(NUM)。

* ID列是PARENT_ID列的子项 * COLOR列是ID列的指定颜色(最高4000,3000,2000,1000最低)
* ID为1的行,PARENT ID 0为最高/根级别。
*我没有ID为0的行;

我的问题是,我不知道如何:
 1.根据子颜色的最高颜色值更改父颜色。
例如:id为2的行必须为4000色(4000 [row id 4]> 3000 [row 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连接的多个表的结果。我已经设法使用Connect By获得最大颜色,但它只反映了它的直接父颜色而不是它的祖父颜色。

请建议..

1 个答案:

答案 0 :(得分: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.