2011-01-11 35 views
7

que tienen la siguiente tabla en un oráculo:recursividad En Oracle

Parent(arg1, arg2) 

y quiero que el cierre transitivo de la relación de los padres. Es decir, quiero la siguiente tabla

Ancestor(arg1, arg2) 

¿Cómo es esto posible en Oracle?

que estoy haciendo lo siguiente:

WITH Ancestor(arg1, arg2) AS (

    SELECT p.arg1, p.arg2 from parent p 
    UNION 
    SELECT p.arg1 , a.arg2 from parent p, Ancestor a 
    WHERE p.arg2 = a.arg1 

) 

SELECT DISTINCT * FROM Ancestor; 

me sale el error

*Cause: column aliasing in WITH clause is not supported yet 
*Action: specify aliasing in defintion subquery and retry 
Error at Line: 1 Column: 20 

¿Cómo puedo solucionar esto sin aliasing columna?

Respuesta

22
WITH Ancestor(arg1, arg2) AS 
     (
     SELECT p.arg1, p.arg2 
     FROM parent p 
     WHERE arg2 NOT IN 
     (
      SELECT arg1 
      FROM parent 
     ) 

     UNION ALL 

     SELECT p.arg1, a.arg2 
     FROM Ancestor a 
     JOIN parent p 
     ON  p.arg2 = a.arg1 
     ) 
SELECT * 
FROM Ancestor 

Oracle sólo admite recursiva CTE desde 11g Release 2.

En versiones anteriores, utilice CONNECT BY cláusula:

SELECT arg1, CONNECT_BY_ROOT arg2 
FROM parent 
START WITH 
     arg2 NOT IN 
     (
     SELECT arg1 
     FROM parent 
     ) 
CONNECT BY 
     arg2 = PRIOR arg1 
+8

11g versión '2' para ser precisos –