अन्य प्रोग्रामिंग भाषाओं से एसक्यूएल में आ रहा है, एक पुनरावर्ती क्वेरी की संरचना बल्कि विषम लगती है। इसके साथ कदम से कदम मिलाकर चलें, और ऐसा लगता है कि यह अलग हो जाएगा।
निम्नलिखित सरल उदाहरण पर विचार करें:
CREATE TABLE #NUMS
(N BIGINT);
INSERT INTO #NUMS
VALUES (3), (5), (7);
WITH R AS
(
SELECT N FROM #NUMS
UNION ALL
SELECT N*N AS N FROM R WHERE N*N < 10000000
)
SELECT N FROM R ORDER BY N;
चलो इसके माध्यम से चलते हैं।
सबसे पहले, एंकर सदस्य निष्पादित करता है और परिणाम सेट आर में डाल दिया जाता है। इसलिए आर को {3, 5, 7} से आरंभ किया जाता है।
फिर, UNION ALL के नीचे निष्पादन बूँदें और पुनरावर्ती सदस्य को पहली बार निष्पादित किया जाता है। यह R पर निष्पादित होता है (अर्थात R पर, जो वर्तमान में हमारे हाथ में है: {3, 5, 7})। इसके परिणामस्वरूप {९, २५, ४ ९} हैं।
यह इस नए परिणाम के साथ क्या करता है? क्या यह {९, २५, ४ ९} को मौजूदा {३, ५, label} तक ले जाता है, परिणामी यूनियन आर को लेबल करता है, और फिर वहाँ से पुनरावृत्ति करता है? या क्या यह नया परिणाम {9, 25, 49} होने के लिए आर को फिर से परिभाषित करता है और बाद में सभी संघ-अंतर्ग्रहण करता है?
न तो विकल्प समझ में आता है।
यदि R अब {3, 5, 7, 9, 25, 49} है और हम पुनरावृत्ति के अगले पुनरावृत्ति को निष्पादित करते हैं, तो हम {9, 25, 49, 81, 625, 2401} के साथ समाप्त हो जाएंगे और हम {3, 5, 7} खो दिया है।
यदि आर अब केवल {९, २५, ४ ९} है, तो हमें एक गलत समस्या है। R को एंकर सदस्य परिणाम सेट और उसके बाद के सभी पुनरावर्ती सदस्य परिणाम सेटों का मिलन समझा जाता है। जबकि {९, २५, ४ ९} केवल R का एक घटक है। यह पूर्ण R नहीं है जो हमने अभी तक अर्जित किया है। इसलिए, आर से चयन के रूप में पुनरावर्ती सदस्य को लिखने का कोई मतलब नहीं है।
मैं निश्चित रूप से सराहना करता हूं कि @Max Vernon और @Michael S ने नीचे क्या विस्तृत किया है। अर्थात्, (1) सभी घटकों को पुनरावर्तन सीमा या अशक्त सेट तक बनाया गया है, और फिर (2) सभी घटकों को एक साथ जोड़ा जाता है। यह है कि मैं वास्तव में काम करने के लिए SQL पुनरावर्तन को कैसे समझता हूं।
यदि हम एसक्यूएल को फिर से डिज़ाइन कर रहे थे, तो शायद हम एक अधिक स्पष्ट और स्पष्ट सिंटैक्स लागू करेंगे, कुछ इस तरह:
WITH R AS
(
SELECT N
INTO R[0]
FROM #NUMS
UNION ALL
SELECT N*N AS N
INTO R[K+1]
FROM R[K]
WHERE N*N < 10000000
)
SELECT N FROM R ORDER BY N;
गणित में एक प्रेरक प्रमाण की तरह।
SQL रिकर्सन के साथ समस्या यह है कि यह वर्तमान में खड़ा है कि यह एक भ्रमित तरीके से लिखा गया है। जिस तरह से यह लिखा गया है कि प्रत्येक घटक आर से चयन करके बनता है, लेकिन इसका मतलब यह नहीं है कि अब तक का पूर्ण आर (या, प्रतीत होता है) का निर्माण किया गया है। यह सिर्फ पिछले घटक का मतलब है।