2016-05-11 2 views
0

У меня есть таблица STRUCTURE, которая содержит следующие данные при запросе с:Oracle SQL Структура 3 уровня из одной таблицы

SELECT * 
FROM STRUCTURE 
WHERE structure_id = 'LOCA' 

structure_id name_value description  level_no item_above structure_item_type_db Level_id level_description 
LOCA   3000  North   4   300   1      4   Area 
LOCA   827   North A   4   3000  2      4   Area 
LOCA   828   North 1   4   3000  2      4   Area 
LOCA   829   North 2   4   3000  2      4   Area 
LOCA   830   North 3   4   3000  2      4   Area 
LOCA   300   North & South 3   LOCA  1      3   Area Group 
LOCA   3010  North Other  4   300   1      4   Area 
LOCA   879   North Other  4   3010  2      4   Area 

У меня есть этот код, чтобы получить 2 Уровни (Описание и Area_Group), но я не могу получить 3-го уровня.

WITH CTE(NAME_VALUE, ITEM_ABOVE, DESCRIPTION, Area_Group) AS 
(
    SELECT NAME_VALUE, ITEM_ABOVE, DESCRIPTION, DESCRIPTION AS Area_Group 
    FROM STRUCTURE 
    WHERE ITEM_ABOVE = 'LOCA' AND Structure_id = 'LOCA' 
    UNION ALL 
    SELECT t1.NAME_VALUE, t1.ITEM_ABOVE, t1.DESCRIPTION, t2.Area_Group 
    FROM STRUCTURE t1 
    JOIN CTE t2 ON t1.ITEM_ABOVE = t2.NAME_VALUE 
    WHERE Structure_id = 'LOCA' 
) 
SELECT DESCRIPTION, Area_Group 
FROM CTE 

дает мне:

description  Area_Group 
North   North & South 
North A   North & South 
North 1   North & South 
North 2   North & South 
North 3   North & South 
North & South North & South 
North Other  North & South 
North Other  North & South 

Я хочу, чтобы выводить данные (WHERE structure_id = 'LOCA' необходимы, поскольку есть другие структуры, которые не используются в данном сценарии), чтобы выглядеть следующим образом:

description  Area_Group  Area 
North   North & South North 
North A   North & South North 
North 1   North & South North 
North 2   North & South North 
North 3   North & South North 
North & South North & South North 
North Other  North & South North Other 
North Other  North & South North Other 

Так что, если представить структуру как структуру дерева ...

Area_Group - North & South 
    └ Area - North 
     └ description - North A 
      description - North 1 
      description - North 2 
      description - North 3 
    └ Area - North Other 
     └ description - North Other 
+0

Где 'Площадь Group' и' Area' определены? Ваш вопрос не очень ясен. –

+0

В поле 'level_description', позвольте мне добавить еще некоторый контекст для ожидаемого вывода. – Matt

+0

@GordonLinoff Я добавил древовидную структуру для ясности. – Matt

ответ

1

Это должно помочь, два Самосоединения и CASE WHEN заявления:

WITH 
    sa AS (SELECT * 
     FROM structure 
     WHERE structure_id = 'LOCA'), 
    sb AS (SELECT s1.description, s1.name_value, s1.level_id, 
     CASE WHEN s1.structure_item_type_db = 1 
       THEN s1.description 
       ELSE s2.description 
     END area, 
     CASE WHEN s1.structure_item_type_db = 1 
       THEN s1.item_above 
       ELSE s2.item_above 
     END item_above 
     FROM sa s1 
     LEFT JOIN sa s2 ON s2.name_value = s1.item_above) 
     SELECT s1.description, 
     CASE WHEN s1.level_id = 3 
       THEN s1.description 
       ELSE s2.description 
     END area_group, s1.area 
     FROM sb s1 
     LEFT JOIN sb s2 ON s2.name_value = s1.item_above 

SQL Fiddle demo

В ваших данных, в строке 6 item_above имеет значение 3500, и там нет строки с такими name_value, поэтому left join ничего не придает. Столбец ID добавлен только для презентаций.

Выход:

DESCRIPTION  AREA_GROUP  AREA 
--------------- --------------- --------------- 
    North   North & South North 
    North A   North & South North 
    North 1   North & South North 
    North 2   North & South North 
    North 3   North & South North   
    North & South North & South North & South 
    North Other  North & South North Other 
    North Other  North & South North Other 
+0

Как насчет иерархического запроса? – Jigar

+0

@Jigar - Иерархический запрос является альтернативой, особенно когда количество подуровней неизвестно. Вы можете отправить такой запрос, как новый ответ. Для 3-х уровней я остался бы на самосоединении или, возможно, на модифицированном запросе, основанном на аналитических функциях. –

Смежные вопросы