2012-02-03 12 views
10

नीचेहम रिकर्सिव सीटीई में बाहरी जुड़ने का उपयोग क्यों नहीं कर सकते?

;WITH GetParentOfChild AS 
    (
     SELECT 
      Rn = ROW_NUMBER() Over(Order By (Select 1)) 
      ,row_id AS Parents 
      ,parent_account_id As ParentId 
     FROM siebelextract..account 
     WHERE row_id = @ChildId 
     UNION ALL 
     SELECT 
      Rn + 1 
      ,a.row_id as Parents 
      ,a.parent_account_id As ParentId  
     FROM siebelextract..account a 
     JOIN GetParentOfChild gp on a.row_id = gp.ParentId 
    ) 

SELECT TOP 1 @ChildId = Parents 
FROM GetParentOfChild 
ORDER BY Rn DESC 

है क्या यह है कि किसी भी बच्चे को दिया, यह रूट स्तर माता पिता वापस आ जाएगी .... कार्यक्रम बिल्कुल ठीक काम कर रहा है सब समय है

बस बाहर करने पर विचार करें ... जिज्ञासा/प्रयोगात्मक खातिर की मैं वाम बाहरी करने के लिए शामिल हों शामिल हों बदल गया और यह

संदेश 462, स्तर 16, राज्य 1, प्रक्रिया GetParent, लाइन 9 बाहरी शामिल होने के लिए एक पुनरावर्ती आम तालिका के पुनरावर्ती भाग में अनुमति नहीं है सूचना अभिव्यक्ति 'GetParentOfChild'।

मेरा सवाल यह है कि क्यों सीटीई का रिकर्सिव हिस्सा बाएं बाहरी में शामिल नहीं हो सकता है? क्या यह डिजाइन द्वारा है?

धन्यवाद

उत्तर

6

निम्नलिखित मदों एक पुनरावर्ती सदस्य की CTE_query_definition में की अनुमति नहीं है हाँ, यह डिजाइन के द्वारा होता है, Guidelines for Defining and Using Recursive Common Table Expressions

पढ़ें:

  • DISTINCT का चयन करें
  • ग्रुप द्वारा
  • होने
  • अदिश एकत्रीकरण
  • टॉप
  • वाम, ठीक है, बाहरी शामिल हों (भीतरी में शामिल होने की अनुमति दी है)
  • सबक्वेरी

सूचना है कि अगर आपकी क्वेरी एक बाएं बनाने इसे करने के लिए शामिल हो सीटीई के माध्यम से स्वयं एक अनंत रिकर्सन बन सकता है।

+8

मुझे नहीं लगता कि यह उत्तर या लिंक वास्तव में "क्यों" जवाब देता है। उदाहरण के लिए अगली पुनरावृत्ति की दिशा को नियंत्रित करने के लिए मैं दो बाएं जुड़ने (बाहरी तालिकाओं में) को जोड़ना चाहता था। अनंत रिकर्सन लूप के दौरान सभी को छोड़ने के लिए एक अच्छे कारण की तरह प्रतीत नहीं होता है। – crokusek

+3

@ क्रोकुसेक, पिछले सीटीई एक्सप्रेशन में अपनी सहकर्मी क्वेरी तैयार करें और आंतरिक इसे अपने रिकर्सिव सीटी क्वेरी में शामिल करें। – danihp

+0

हा, मैंने कोशिश की और यह चल रहा है, साफ चाल। अगर मैंने इसे सही किया, तो मुझे बाएं जॉइन को सीटीई में पूर्ण बाहरी में परिवर्तित करना पड़ा। यह भाग गया लेकिन क्वेरी प्लान दुखी हो जाती है - यह आरटीई (आकारों के आधार पर खत्म नहीं होती) से शुरू होने से पहले पूरी तरह से पूरी तरह से गणना करती है, जो कि केवल वही चीज़ की जांच करने की अच्छीता खो देती है। सीटी परिणाम छोटा होने पर छोड़कर एक कर्सर प्रदर्शन करेगा। कुछ मामलों के लिए शायद एक अच्छा कामकाज। – crokusek

8

आप रिकर्सिव सीटीई के साथ बाएं जॉइन का उपयोग नहीं कर सकते हैं लेकिन आप बाहरी आवेदन का उपयोग कर सकते हैं जो एक ही परिणाम देना चाहिए।

संबंधित मुद्दे

 संबंधित मुद्दे