2014-10-03 2 views
0

У меня есть таблица под названием «тест». Он содержит столбцы родителя и ребенка.Как найти самый высокий родительский уровень или поле в Oracle?

Parent Child 
    1  101 
    1  102 
    1  103 
101  121 
101  123 
103  133 
121  80 
121  81 

Теперь я написал запрос, который приносит мне всех детей/родителей для данного значения «1».

(SELECT parent,child,LEVEL FROM TEST 
    START WITH child= 1 
    CONNECT BY PRIOR parent=child) 
UNION ALL 
    (SELECT parent,child,LEVEL FROM TEST 
     START WITH parent=1 
     CONNECT BY PRIOR child=parent) 
     ORDER BY parent 

Но я хочу, чтобы все дочерние/родительские элементы в этой иерархии были независимо от любого заданного значения ..i.e. если я даю «80» ...., я должен получить ВЫСШЕЕ РОДИТЕЛЬСКОЕ ЗНАЧЕНИЕ (в данном случае «1»), а затем искать все дочерние элементы этого наивысшего родительского значения ниже.

+0

У меня трудное время, чтобы понять ваши потребности. Вы ищете «всех детей, имеющих общего предка»? –

+0

Что делает '1'« ВЫСОКОЙ РОДИТЕЛЬСКОЙ СТОИМОСТЬЮ »' 80'? Это потому, что на самом деле это самое низкое значение в возрастающем упорядоченном списке? –

+0

@ Caffé Насколько я понимаю, '1' является конечным предком' 80': '80 => 121 => 101 => 1'. Но неясно, что делать после этого. Найти всех потомков '1'? Или только его «прямые» дети? –

ответ

2

Вы можете использовать рекурсивный запрос и псевдо-столбец CONNECT_BY_ISLEAF, чтобы найти конечную предку узла:

SELECT parent AS ancestor 
    FROM X 
    WHERE CONNECT_BY_ISLEAF <> 0 
    START WITH child=80 
    CONNECT BY PRIOR parent=child 
--   ^^^^^^^^^^^^^^^^^^ 
--    ascendant order 

После того, как у вас есть «окончательный предок», второй рекурсивный запрос будет получить все потомки от этого узла:

SELECT child AS descendant, LEVEL 
    FROM X 
    START WITH parent=1 
    CONNECT BY PRIOR child=parent 
--   ^^^^^^^^^^^^^^^^^^ 
--   descendant order 

Пожалуйста, обратите внимание на псевдо-столбце LEVEL, что позволит вам знать «расстояние» между узлом и его конечным предком.

Собираем все вместе:

SELECT child AS descendant, LEVEL 
    FROM X 
    START WITH parent IN (

    SELECT parent AS ancestor 
     FROM X 
     WHERE CONNECT_BY_ISLEAF <> 0 
     START WITH child=80 
     CONNECT BY PRIOR parent=child 

) 
    CONNECT BY PRIOR child=parent 

Производство, учитывая ваши данные выборки:

DESCENDANT LEVEL 
101   1 
121   2 
80   3 
81   3 
123   2 
102   1 
103   1 
133   2 
+0

Спасибо за ваш ответ. Это служит моей цели. – Anitha

+0

+1, приятно объяснить! –

+0

Я исследовал и обнаружил, что в Teradata нет предложения Connect By. Если мы хотим сделать то же самое в Teradata, каким должен быть мой подход к тому же вопросу? Использование запроса рекурсивного фактора .... как я могу это сделать? – Anitha

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