Oracle中的递归
我在oracle中有下表:Oracle中的递归,oracle,recursion,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.arg
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
如何在没有列别名的情况下解决此问题?Oracle允许递归查询。 见: 当然,这些通常假设层次数据都在一个表中。将其拆分为单独的表会使事情变得复杂
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
仅支持递归CTE
,因为11g
release2
在早期版本中,使用connectby
子句:
SELECT arg1, CONNECT_BY_ROOT arg2
FROM parent
START WITH
arg2 NOT IN
(
SELECT arg1
FROM parent
)
CONNECT BY
arg2 = PRIOR arg1
准确地说,11g发布
2