我在oracle中有下表:
Parent(arg1, arg2)
Run Code Online (Sandbox Code Playgroud)
我希望关系父的传递闭包.也就是说,我想要下表
Ancestor(arg1, arg2)
Run Code Online (Sandbox Code Playgroud)
这在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;
Run Code Online (Sandbox Code Playgroud)
我收到了错误
*Cause: column aliasing in WITH clause is not supported yet
*Action: specify aliasing in defintion subquery and retry
Error at Line: 1 Column: 20
Run Code Online (Sandbox Code Playgroud)
如何在没有列别名的情况下解决此问题?
Qua*_*noi 23
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
Run Code Online (Sandbox Code Playgroud)
Oracle仅支持CTE自11gRelease 2 以来的递归.
在早期版本中,使用CONNECT BY子句:
SELECT arg1, CONNECT_BY_ROOT arg2
FROM parent
START WITH
arg2 NOT IN
(
SELECT arg1
FROM parent
)
CONNECT BY
arg2 = PRIOR arg1
Run Code Online (Sandbox Code Playgroud)