在Oracle中recursion

我在oracle中有下面的表格:

Parent(arg1, arg2) 

我想要关系父母的传递闭包。 那就是,我想要下面的表格

 Ancestor(arg1, arg2) 

在Oracle中这怎么可能?

我正在做以下事情:

 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; 

我得到错误

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

我怎样才能解决这个没有列别名?

 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仅支持自11g第2版​​以来的recursionCTE

在早期版本中,使用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允许recursion查询。 请参阅: http : //www.adp-gmbh.ch/ora/sql/connect_by.html

当然,这些通常都假设分层数据都在一张表中。 将其拆分成不同的表格会使事情变得复杂。