पुनरावर्ती CTE के BOL विवरण पुनरावर्ती निष्पादन के शब्दार्थ का वर्णन इस प्रकार है:
- लंगर और पुनरावर्ती सदस्यों में सीटीई की अभिव्यक्ति को विभाजित करें।
- पहले आह्वान या आधार परिणाम सेट (T0) बनाने वाले एंकर सदस्य (ओं) को चलाएँ।
- एक इनपुट के रूप में Ti और आउटपुट के रूप में Ti + 1 के साथ पुनरावर्ती सदस्य को चलाएँ।
- एक खाली सेट वापस आने तक चरण 3 को दोहराएं।
- परिणाम सेट लौटाएं। यह T0 से Tn का एक UNION ALL है।
नोट उपरोक्त एक तार्किक विवरण है।ऑपरेशन का भौतिक क्रम कुछ हद तक अलग हो सकता है जैसा कि यहाँ सचित्र है
आपके सीटीई में इसे लागू करने से मुझे निम्न पैटर्न के साथ एक अनंत लूप की उम्मीद होगी
+-----------+---------+---+---+---+
| Invocation| Results |
+-----------+---------+---+---+---+
| 1 | 1 | 2 | 3 | |
| 2 | 4 | 5 | | |
| 3 | 1 | 2 | 3 | |
| 4 | 4 | 5 | | |
| 5 | 1 | 2 | 3 | |
+-----------+---------+---+---+---+
इसलिये
select a
from cte
where a in (1,2,3)
एंकर अभिव्यक्ति है। यह स्पष्ट 1,2,3
रूप से लौटता हैT0
इसके बाद पुनरावर्ती अभिव्यक्ति चलता है
select a
from cte
except
select a
from r
साथ 1,2,3
इनपुट कि का उत्पादन निकलेगा के रूप में 4,5
के रूप में T1
तो प्रत्यावर्तन के अगले दौर के लिए वापस आ जाएगी में कि वापस प्लग-इन 1,2,3
और इतने पर अनिश्चित काल के लिए।
हालांकि वास्तव में ऐसा नहीं होता है। ये पहले 5 आह्वान के परिणाम हैं
+-----------+---------+---+---+---+
| Invocation| Results |
+-----------+---------+---+---+---+
| 1 | 1 | 2 | 3 | |
| 2 | 1 | 2 | 4 | 5 |
| 3 | 1 | 2 | 3 | 4 |
| 4 | 1 | 2 | 3 | 5 |
| 5 | 1 | 2 | 3 | 4 |
+-----------+---------+---+---+---+
उपयोग OPTION (MAXRECURSION 1)
करने से और वृद्धि में समायोजन से 1
यह देखा जा सकता है कि यह एक चक्र में प्रवेश करता है जहां प्रत्येक क्रमिक स्तर लगातार आउटपुट 1,2,3,4
और के बीच टॉगल करेगा 1,2,3,5
।
जैसा कि इस ब्लॉग पोस्ट में @Quassnoi ने चर्चा की है । देखे गए परिणामों का पैटर्न ऐसा है मानो प्रत्येक मंगलाचरण कहाँ कर रहा है(1),(2),(3),(4),(5) EXCEPT (X)
X
पिछले आह्वान से अंतिम पंक्ति है।
संपादित करें: एसक्यूएल कीवी के उत्कृष्ट उत्तर को पढ़ने के बाद यह दोनों स्पष्ट है कि ऐसा क्यों होता है और यह पूरी कहानी नहीं है कि स्टैक पर अभी भी सामान का भार है जो कभी भी संसाधित नहीं हो सकता है।
एंकर उत्सर्जन करता है 1,2,3
क्लाइंट स्टैक सामग्री का है3,2,1
स्टैक से 3 पॉपअप, स्टैक सामग्री 2,1
LASJ रिटर्न 1,2,4,5
, स्टैक सामग्री5,4,2,1,2,1
5 ढेर, ढेर सामग्री बंद 4,2,1,2,1
LASJ रिटर्न 1,2,3,4
स्टैक सामग्री4,3,2,1,5,4,2,1,2,1
4 ढेर, ढेर सामग्री बंद 3,2,1,5,4,2,1,2,1
LASJ रिटर्न 1,2,3,5
स्टैक सामग्री5,3,2,1,3,2,1,5,4,2,1,2,1
5 ढेर, ढेर सामग्री बंद 3,2,1,3,2,1,5,4,2,1,2,1
LASJ 1,2,3,4
स्टैक सामग्री
लौटाता है4,3,2,1,3,2,1,3,2,1,5,4,2,1,2,1
यदि आप पुनरावर्ती सदस्य को तार्किक रूप से समकक्ष (डुप्लिकेट / NULLs की अनुपस्थिति में) अभिव्यक्ति से प्रतिस्थापित करते हैं
select a
from (
select a
from cte
where a not in
(select a
from r)
) x
यह अनुमति नहीं है और त्रुटि उठाती है "पुनरावर्ती संदर्भों को उपश्रेणियों में अनुमति नहीं है।" तो शायद यह एक निरीक्षण है जो EXCEPT
इस मामले में भी अनुमति है।
परिवर्धन:
Microsoft ने अब नीचे दिए अनुसार मेरी कनेक्ट प्रतिक्रिया पर प्रतिक्रिया दी है
जैक का अनुमान सही है: यह एक वाक्यविन्यास त्रुटि होनी चाहिए थी; पुनरावर्ती संदर्भों को EXCEPT
खंडों में वास्तव में अनुमति नहीं दी जानी चाहिए । हम इस बग को आगामी सेवा रिलीज में संबोधित करने की योजना बना रहे हैं। इस बीच, मैं EXCEPT
खंडों में पुनरावर्ती संदर्भों से बचने का सुझाव दूंगा।
EXCEPT
एएनएसआई एसक्यूएल मानक का पालन करने पर हम पुनरावृत्ति को प्रतिबंधित करते हैं, जिसमें इस प्रतिबंध को तब से शामिल किया गया है जब से पुनरावृत्ति पेश की गई थी (1999 में मेरा मानना है)। EXCEPT
इस तरह की एसक्यूएल के रूप में घोषणात्मक भाषाओं में पुनर्विचार (जिसे "अप्रतिबंधित निषेध" भी कहा जाता है) के लिए शब्दार्थ क्या होना चाहिए, इस पर कोई व्यापक समझौता नहीं हुआ है । इसके अलावा, आरडीबीएमएस प्रणाली में ऐसे शब्दार्थों को कुशलतापूर्वक (यथोचित आकार के डेटाबेस के लिए) कार्यान्वित करना कठिन (यदि असंभव नहीं है)।
और ऐसा लगता है कि अंतिम कार्यान्वयन 2014 में डेटाबेस के लिए 120 या उससे अधिक की संगतता स्तर के साथ किया गया था ।
EXCEPT क्लॉज में पुनरावर्ती संदर्भ ANSI SQL मानक के अनुपालन में एक त्रुटि उत्पन्न करता है।