चक्रीय संदर्भों के साथ "मज़ा":
मान लीजिए कि मेरे पास एक तालिका तत्व है जिसमें तत्वों का पदानुक्रम है, जो एक पिता आईडी द्वारा निर्मित है।
पिता आईडी फ़ील्ड रूट के लिए रिक्त है।
अन्य सभी रिकॉर्डों में एक गैर-शून्य पिता आईडी है (स्वतः पूर्ण) प्राथमिक कुंजी (ID
) पिता तत्व की।
उदाहरण के लिए, का उपयोग कर
SELECT *
FROM Elements
WHERE FATHER_ID not in (SELECT ID FROM Elements)
मुझे ऐसे सभी तत्व मिल सकते हैं जिनके पिता के अमान्य संदर्भ हैं (FATHER_ID
एक विदेशी कुंजी नहीं है, मान लें कि इस उदाहरण में)।
लेकिन मैं उन तत्वों को कैसे खोज सकता हूं जिनके पास एक वैध पिता संदर्भ BUT है जिनके पिता संदर्भों की श्रृंखला जड़ में समाप्त नहीं होती है? मुझे लगता है कि यह केवल चक्रीय संदर्भों के लिए हो सकता है, उदाहरण के लिए A, B का पिता है, लेकिन B, A का पिता भी है। ऐसा "सबट्री" रूट से जुड़ा नहीं है और इस तरह मुख्य पेड़ का हिस्सा नहीं है। मैं ऐसे उपप्रकार खोजना चाहता हूं।
बेशक, मैं एक ऐसे प्रश्न की तलाश कर रहा हूं जो उन तत्वों को बचाता है जो चक्रीय संदर्भ का नेतृत्व करते हैं, भले ही संदर्भों की श्रृंखला कितनी भी लंबी हो।
क्या यह एसक्यूएल में संभव है, या क्या मुझे पुनरावृत्त समाधान की आवश्यकता है?
उत्तर:
जवाब के लिए 5 № 1SELECT n.*, CONNECT_BY_ROOT(id), level
FROM elements n
START WITH
id IN
(
SELECT MIN(id)
FROM (
SELECT id, CONNECT_BY_ROOT(id) AS root
FROM elements
START WITH
id IN
(
SELECT id
FROM elements n
WHERE CONNECT_BY_ISCYCLE = 1
CONNECT BY NOCYCLE
father_id = PRIOR id
)
CONNECT BY NOCYCLE
id = PRIOR father_id
)
GROUP BY
root
)
CONNECT BY NOCYCLE
id = PRIOR father_id
आप इस लेख को पढ़ना चाह सकते हैं: