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