2009-09-18 1 views
5

у меня есть отношения родителя-ребенок в базе данных-таблице Oracle 9iоракула 9i получить самую высокий элемент дерева с данным ребенком

как:

parent | child 
1  | 2 
2  | 3 
2  | 4 
null | 1 
1  | 8 

мне нужно, чтобы получить абсолютный родитель данного ребенок. Скажите, у меня есть ребенок 4, он должен дать мне родитель: 1

Я уже смотрел CONNECT BY, но я не могу найти решение.

+0

Итак, вы хотите конечные родитель , не все связи между ними? –

+0

да, это право. Я не сейчас во время выполнения, сколько уровней есть. – jwdehaan

ответ

4

вы можете использовать CONNECT BY запроса для создания списка родителей, а затем фильтр:

SQL> WITH tree AS (
    2  SELECT 1 parent_id, 2 child_id FROM DUAL 
    3  UNION ALL SELECT 2 , 3 FROM DUAL 
    4  UNION ALL SELECT 2 , 4 FROM DUAL 
    5  UNION ALL SELECT null, 1 FROM DUAL 
    6  UNION ALL SELECT 1 , 8 FROM DUAL 
    7 ) 
    8 SELECT child_id 
    9 FROM (SELECT * 
10   FROM tree 
11   CONNECT BY PRIOR parent_id = child_id 
12   START WITH child_id = 4) 
13 WHERE parent_id IS NULL; 

    CHILD_ID 
---------- 
     1 
0
SELECT parent 
FROM (
     SELECT parent 
     FROM (
       SELECT parent, level AS l 
       FROM mytable 
       START WITH 
         child = 4 
       CONNECT BY 
         child = PRIOR parent 
       ) 
     ORDER BY 
       l DESC 
     ) 
WHERE rownum = 1 

Это даст вам NULL как абсолютный родитель.

Если вы хотите 1, замените parent с child:

SELECT child 
FROM (
     SELECT child 
     FROM (
       SELECT child, level AS l 
       FROM mytable 
       START WITH 
         child = 4 
       CONNECT BY 
         child = PRIOR parent 
       ) 
     ORDER BY 
       l DESC 
     ) 
WHERE rownum = 1 
+0

Мне нужен абсолютный родитель, не предопределенное количество уровней. – jwdehaan

+0

Этот запрос дает абсолютный родительский ('NULL' - это случай). Если вы хотите «1», просто замените «parent» на «child» в запросе выше. – Quassnoi

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