Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

पुनरावर्ती सबक्वेरी फैक्टरिंग के साथ साइकिल का पता लगाना

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 वास्तव में सेट-आधारित हैं?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cx_Oracle के साथ तालिका नाम के लिए बाध्यकारी चर

  2. 2PL, कठोर बनाम सख्त मॉडल, क्या कोई लाभ है?

  3. वीडियो:आरएसी पर Oracle 12c पहचान कॉलम प्रदर्शन

  4. Show_Alert का उपयोग करके Oracle प्रपत्रों में मोडल विंडो संदेश प्रदर्शित करना

  5. जावा मल्टीकास्ट टाइम टू लिव हमेशा 0 . होता है