/ / SQL पिता-आईडी-संगठित पेड़ में चक्रीय संदर्भ खोजने के लिए चयन करें? - sql, oracle, cyclic-reference

SQL पिता-आईडी-संगठित वृक्ष में चक्रीय संदर्भ खोजने के लिए चयन करें? - sql, oracle, cyclic-reference

चक्रीय संदर्भों के साथ "मज़ा":

मान लीजिए कि मेरे पास एक तालिका तत्व है जिसमें तत्वों का पदानुक्रम है, जो एक पिता आईडी द्वारा निर्मित है।

पिता आईडी फ़ील्ड रूट के लिए रिक्त है।

अन्य सभी रिकॉर्डों में एक गैर-शून्य पिता आईडी है (स्वतः पूर्ण) प्राथमिक कुंजी (ID) पिता तत्व की।

उदाहरण के लिए, का उपयोग कर

SELECT *
FROM Elements
WHERE FATHER_ID not in (SELECT ID FROM Elements)

मुझे ऐसे सभी तत्व मिल सकते हैं जिनके पिता के अमान्य संदर्भ हैं (FATHER_ID एक विदेशी कुंजी नहीं है, मान लें कि इस उदाहरण में)।

लेकिन मैं उन तत्वों को कैसे खोज सकता हूं जिनके पास एक वैध पिता संदर्भ BUT है जिनके पिता संदर्भों की श्रृंखला जड़ में समाप्त नहीं होती है? मुझे लगता है कि यह केवल चक्रीय संदर्भों के लिए हो सकता है, उदाहरण के लिए A, B का पिता है, लेकिन B, A का पिता भी है। ऐसा "सबट्री" रूट से जुड़ा नहीं है और इस तरह मुख्य पेड़ का हिस्सा नहीं है। मैं ऐसे उपप्रकार खोजना चाहता हूं।

बेशक, मैं एक ऐसे प्रश्न की तलाश कर रहा हूं जो उन तत्वों को बचाता है जो चक्रीय संदर्भ का नेतृत्व करते हैं, भले ही संदर्भों की श्रृंखला कितनी भी लंबी हो।

क्या यह एसक्यूएल में संभव है, या क्या मुझे पुनरावृत्त समाधान की आवश्यकता है?

उत्तर:

जवाब के लिए 5 № 1
SELECT  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

आप इस लेख को पढ़ना चाह सकते हैं: