2009-09-18 751 views
5

tengo una relación padre-hijo en una base de datos de tablas de Oracle 9ioráculo conseguir más alto miembro de árbol con determinado niño

como:

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

que necesito para obtener la matriz absoluta de un determinado niño. Diga, tengo hijo 4, me tiene que dar el padre: 1

Ya busqué CONNECT BY, pero no puedo encontrar la solución.

+0

Así que quieren que la matriz última , no todos los enlaces entre? –

+0

sí, eso es correcto. No tengo ahora en tiempo de ejecución cuántos niveles hay. – jwdehaan

Respuesta

4

Se puede usar un CONNECT BY consulta para crear la lista de los padres y luego filtro:

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 

Esto le dará NULL como padre absoluto.

Si desea 1, reemplace 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

Necesito el padre absoluto, sin un número predefinido de niveles. – jwdehaan

+0

Esta consulta proporciona el padre absoluto ('NULL' es este caso). Si desea '1', simplemente reemplace' parent' con 'child' en la consulta anterior. – Quassnoi

Cuestiones relacionadas