2011-01-11 12 views
7

में मैं एक दैवज्ञ में निम्न तालिका है:Recursion ओरेकल

Parent(arg1, arg2) 

और मैं संबंध माता पिता की सकर्मक बंद करना चाहते हैं। यही है, मैं निम्नलिखित तालिका

Ancestor(arg1, arg2) 

ओरेकल में यह कैसे संभव है?

मैं कर रहा हूँ निम्नलिखित:

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 केवल पुनरावर्ती का समर्थन करता है CTE11g के बाद से रिलीज 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' सटीक होना करने के लिए –

1

ओरेकल रिकर्सिव प्रश्नों की अनुमति देता है। देखें: http://www.adp-gmbh.ch/ora/sql/connect_by.html

बेशक

, इन आमतौर पर मान श्रेणीबद्ध डेटा सब एक तालिका में है। इसे अलग-अलग तालिकाओं में विभाजित करना चीजों को जटिल बनाता है।