2014-01-06 3 views
2

У меня есть 2 таблицы в оракуле DB: Items and Relationship.Oracle, выберите отношение

пункты:

ID 
--- 
1 
2 
3 
4 
5 
6 
7 

отношение:

ID parent child 
-------------------- 
1  1  2 
2  1  3 
3  1  4 
4  2  5 
5  2  6 
6  3  7 

В таблице отношений, я хранение иерархического строения «элементы» (не спрашивайте, почему она хранится в разных таблицах) ,

Вопрос:

Когда я выполнить этот запрос:

SELECT PARENT_ID, CHILD_ID, CONNECT_BY_ISLEAF, MAX(LEVEL) OVER() + 1 - LEVEL as rev_level 
    FROM relationship 
CONNECT BY PRIOR PARENT_ID = CHILD_ID 
    START WITH CHILD_ID = 7; 

Я не вижу корень родителя, потому что он не существует в этой таблице, как ребенок.

Вопрос заключается в том, как добавить родительский корень (ID = 1) к результату запроса или присоединиться к нему с таблицей «items» и сохранить столбцы результатов (уровень и isleaf).

ответ

0
  1. CONNECT_BY_ISLEAF работает наоборот при использовании снизу вверх поиск (эта ссылка http://technology.amis.nl/2009/11/14/oracle-11gr2-alternative-for-connect_by_isleaf-function-for-recursive-subquery-factoring-dedicated-to-anton/)
  2. Я предполагаю, что вы хотите показать еще данные об элементе (например, имя). Если это так, просто слева соединитесь с таблицей элементов.

    SELECT PARENT_ID AS PARENT_ID,CHILD_ID, i.name AS CHILD_NAME, 
         CONNECT_BY_ISLEAF, 
         MAX(LEVEL) OVER() + 1 - LEVEL AS rev_level 
        FROM items i 
        LEFT JOIN relationship r ON (i.id = r.CHILD_ID) 
    CONNECT BY PRIOR PARENT_ID = CHILD_ID 
        START WITH CHILD_ID = 7 
    ORDER BY REV_LEVEL; 
    

проверить это SQLfiddle: http://sqlfiddle.com/#!4/5c9fa/17 Кроме того, проверьте этот пост про снизу вверх поисков (http://bitbach.wordpress.com/2010/10/18/implementing-bottom-up-path-traversal-for-hierarchical-tables/)

+0

Спасибо, но у меня нет этой строки ЗНАЧЕНИЯ (10, нуль, 1) – user3164429

+0

I изменил условие соединения на (i.id = r.CHILD_ID или i.id = r.PARENT_ID), но теперь мне нужно сгруппировать или добавить DISTINCT – user3164429

0

Обратите внимание, что у вас есть оба направления - родительский и детский. выберите один и не смешивайте два.

1 with x as (
    2  select 1 as id, 1 as parent, 2 as child from dual union all 
    3  select 2,   1   , 3 from dual union all 
    4  select 3   ,1,   4 from dual union all 
    5  select 4   ,2,   5 from dual union all 
    6  select 5   ,2,   6 from dual union all 
    7  select 6   ,3,   7 from dual) 
    8 select * 
    9 from  x 
10 sTART WITH child = 7 
11* CONNECT BY PRIOR id= CHILD 
SQL>/

     ID  PARENT  CHILD 
---------- ---------- ---------- 
     6   3   7 
     5   2   6 
     4   2   5 
     3   1   4 
     2   1   3 
     1   1   2 

подключение производится prior id = child и не prior parent = child

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