2011-01-11 32 views
7

我有以下表在Oracle:遞歸在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 

我該如何解決這個問題?

回答

22
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 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 
+8

11g第二版`2`要精確 – 2011-01-11 16:23:50