Ricorsione in Oracle

Ho la seguente tabella in un oracle:

Parent(arg1, arg2) 

e voglio la chiusura transitiva della relazione genitore. Cioè, voglio la seguente tabella

 Ancestor(arg1, arg2) 

Com’è ansible in Oracle?

Sto facendo quanto segue:

 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; 

Ottengo l’errore

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

Come posso risolvere questo senza l’aliasing di colonne?

 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 supporta solo CTE ricorsivo dalla versione 11g 2.

Nelle versioni precedenti, utilizzare la clausola CONNECT BY :

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

Oracle consente query ricorsive. Vedi: http://www.adp-gmbh.ch/ora/sql/connect_by.html

Naturalmente, questi di solito presuppongono che i dati gerarchici siano tutti in una tabella. Dividerlo in tabelle separate rende le cose complicate.