2009-09-18 15 views
5

ho una relazione padre-figlio in un database-tabella Oracle 9iOracle 9i ottenere più alto membro di albero con data bambino

come:

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

ho bisogno di ottenere il genitore assoluta da un dato bambino. Dire, ho un figlio 4, deve darmi un genitore: 1

Ho già cercato CONNECT BY, ma non riesco a trovare la soluzione.

+0

Così si vuole la controllante , non tutti i collegamenti tra? –

+0

sì, è vero. Non riesco ora a runtime quanti livelli ci sono. – jwdehaan

risposta

4

si potrebbe usare un CONNECT BY query per creare l'elenco dei genitori e poi filtrare:

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 

Questo vi darà NULL come il genitore assoluto.

Se volete 1, sostituire parent con 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

Ho bisogno del genitore assoluto, nessun numero predefinito di livelli. – jwdehaan

+0

Questa query fornisce il padre assoluto ('NULL' è questo caso). Se vuoi '1', sostituisci' parent' con 'child' nella query sopra. – Quassnoi