2014-02-20 5 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 низшему)
* Строка с идентификатором 1 и РОДИТЕЛЕЙ ID 0 является верхний/корневой уровень.
* У меня нет строки с идентификатором 0;

Моя проблема заключается в том, что я не знаю, как:
1. измените цвет родителя в соответствии с его самым высоким значением цвета.
например: строка с идентификатором 2 должна быть 4000 цветов (4000 [номер строки 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. Мне уже удалось получить максимальный цвет с помощью 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

Wow !!! Это было быстро. Большое вам спасибо, Я уже потратил два дня на размышления о том, как подойти к нему и уже в процессе смешивания рекурсии и подключения. Hehe Снова спасибо .. !!! –

+0

Еще один быстрый вопрос, хотя, почему вы назвали идентификатор в TEMP_ID ID вместо ID TEMP_ID в ЗЕЬЕСТ –

+0

@seigfred Mondez: Даць псевдоним для идентификатора, Dats его, Jst хочу diffetentiate между двумя идентификаторами –