CONNECT_BY_ISCYCLE
. पर दस्तावेज़ीकरण से :
CONNECT_BY_ISCYCLE
स्यूडोकॉलम रिटर्न 1
यदि वर्तमान पंक्ति में एक बच्चा है जो उसका पूर्वज भी है
और वह CYCLE
. पर :
एक पंक्ति को एक चक्र बनाने के लिए माना जाता है यदि उसकी पूर्वज पंक्तियों में से एक चक्र स्तंभों के लिए समान मान रखता है।
आपके उदाहरण में, पंक्ति 2
उसका एक बच्चा है जो उसका पूर्वज भी है, लेकिन उसकी id
अभी तक वापस नहीं किया गया है।
दूसरे शब्दों में, CONNECT_BY_ISCYCLE
बच्चों की जांच करता है (जिन्हें अभी लौटाया जाना है), जबकि CYCLE
वर्तमान पंक्ति की जांच करता है (जो पहले ही लौटा दिया गया है)।
CONNECT BY
पंक्ति आधारित है, जबकि पुनरावर्ती CTE
सेट-आधारित हैं।
ध्यान दें कि CYCLE
पर Oracle का दस्तावेज़ीकरण एक "पूर्वज पंक्ति" का उल्लेख है। हालांकि, सामान्यतया, पुनरावर्ती CTE
में "पूर्वजों की पंक्ति" की कोई अवधारणा नहीं है। . यह एक सेट आधारित ऑपरेशन है जो पूरी तरह से पेड़ से परिणाम निकाल सकता है। सामान्यतया, एंकर भाग और पुनरावर्ती भाग विभिन्न तालिकाओं का उपयोग भी कर सकते हैं।
चूंकि पुनरावर्ती CTE
आमतौर पर . हैं पदानुक्रम ट्री बनाने के लिए उपयोग किया जाता है, Oracle
एक साइकिल चेक जोड़ने का फैसला किया। लेकिन सेट-आधारित तरीके के कारण पुनरावर्ती CTE
का संचालन, यह बताना आम तौर पर असंभव है कि अगला चरण एक चक्र उत्पन्न करेगा या नहीं, क्योंकि "पूर्वज पंक्ति" की स्पष्ट परिभाषा के बिना चक्र की स्थिति को भी परिभाषित नहीं किया जा सकता है।
"अगला" चरण करने के लिए, पूरे "वर्तमान" सेट को उपलब्ध होने की आवश्यकता है, लेकिन वर्तमान सेट की प्रत्येक पंक्ति (जिसमें चक्र कॉलम शामिल है) उत्पन्न करने के लिए हमें "अगला" ऑपरेशन के परिणाम प्राप्त करने की आवश्यकता है।पी>
यह कोई समस्या नहीं है यदि वर्तमान सेट में हमेशा एक ही पंक्ति होती है (जैसे CONNECT BY
में) ), लेकिन यह एक समस्या है अगर रिकर्सिव ऑपरेशन एक पूरे के रूप में एक सेट पर परिभाषित किया गया है।
Oracle 11
में नहीं देखा अभी तक, लेकिन SQL Server
पुनरावर्ती लागू करता है CTE
बस एक CONNECT BY
. को छुपाकर उनके पीछे, जिसके लिए कई प्रतिबंध लगाने की आवश्यकता होती है (जिनमें से सभी प्रभावी रूप से सभी सेट-आधारित संचालन को मना करते हैं)।
PostgreSQL
दूसरी ओर, का कार्यान्वयन वास्तव में सेट-आधारित है:आप पुनरावर्ती भाग में एंकर भाग के साथ कोई भी ऑपरेशन कर सकते हैं। इसके पास चक्रों का पता लगाने का कोई साधन नहीं है, हालांकि, चक्रों को पहले स्थान पर परिभाषित नहीं किया गया है।
जैसा कि पहले बताया गया था, MySQL
CTE
implement लागू नहीं करता है बिल्कुल भी (यह HASH JOIN
. को लागू नहीं करता है या MERGE JOIN
s भी, केवल नेस्टेड लूप, इसलिए अधिक आश्चर्यचकित न हों)।
विडंबना यह है कि आज मुझे इसी विषय पर एक पत्र मिला, जिसे मैं अपने ब्लॉग में शामिल करूंगा।
अपडेट करें:
पुनरावर्ती CTE
SQL Server
में है CONNECT BY
. से अधिक नहीं हैं भेष में। चौंकाने वाले विवरण के लिए मेरे ब्लॉग में यह लेख देखें:
- SQL सर्वर:क्या पुनरावर्ती CTE वास्तव में सेट-आधारित हैं?