2011-01-11 20 views
7

Tôi có bảng sau trong một oracle:Recursion Trong Oracle

Parent(arg1, arg2) 

và tôi muốn đóng bắc cầu của phụ huynh liên quan. Tức là, tôi muốn bảng sau đây

Ancestor(arg1, arg2) 

Làm thế nào điều này có thể có trong Oracle?

Tôi đang làm như sau:

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; 

tôi nhận được lỗi

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

Làm thế nào tôi có thể giải quyết này mà không có cột răng cưa?

Trả lời

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 chỉ hỗ trợ đệ quy CTE từ 11g Release 2.

Trong các phiên bản trước đó, sử dụng CONNECT BY khoản:

SELECT arg1, CONNECT_BY_ROOT arg2 
FROM parent 
START WITH 
     arg2 NOT IN 
     (
     SELECT arg1 
     FROM parent 
     ) 
CONNECT BY 
     arg2 = PRIOR arg1 
+8

11g phiên bản '2' để được chính xác –