2009-09-18 8 views
5

Mam relacji rodzic-dziecko w bazie danych stole Oracle 9iOracle 9i uzyskać najwyższy element drzewa z danym dzieckiem

odczuwalna:

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

muszę uzyskać bezwzględną rodzica z danego dziecko. Powiedzmy, że mam dziecko 4, musi mi dać rodzic: 1

Już szukałem połączenia, ale nie mogę znaleźć rozwiązania.

+0

Więc chcesz ostateczną rodzica , nie wszystkie połączenia między? –

+0

tak, to prawda. Nie widzę teraz w środowisku uruchomieniowym, ile poziomów istnieje. – jwdehaan

Odpowiedz

4

można użyć CONNECT BY zapytania zbudować listę rodziców, a następnie filtrować:

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 

Da ci to NULL jako absolutny rodzic.

Jeśli chcesz 1 wymienić parent z 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

Potrzebuję absolutnego rodzica, bez uprzednio określonej liczby poziomów. – jwdehaan

+0

To zapytanie daje bezwzględny rodzic (w tym przypadku "NULL"). Jeśli chcesz '1', po prostu zamień' parent' na 'child' w powyższym zapytaniu. – Quassnoi

Powiązane problemy