मैंने आपकी स्थिति को फिर से बनाने की कोशिश की और मैं ओरेकल को इंडेक्स का बुद्धिमानी से उपयोग करने में सक्षम नहीं था। मुझे यकीन है कि ऐसा करने का कुछ स्मार्ट तरीका है। लेकिन अगर कोई और यहां इसका पता नहीं लगा सकता है, तो नीचे गूंगा, बदसूरत तरीका है।
चूंकि आपको केवल एक निश्चित संख्या में स्तर मिल रहे हैं, इसलिए आप मैन्युअल रूप से एक कनेक्ट बना सकते हैं। पहला स्तर प्राप्त करें, दूसरे स्तर पर संघ (जो पहली क्वेरी की एक प्रति से परिणाम प्राप्त करता है), संघ कि तीसरे स्तर पर (जो दूसरी क्वेरी की एक प्रति से परिणाम प्राप्त करता है), आदि। मैंने केवल तीन स्तर किए यहां, लेकिन आप चौथा बनाने के लिए कॉपी और पेस्ट कर सकते हैं। इसका उपयोग करना कठिन है क्योंकि मूल आईडी को कई बार दोहराया जाता है, लेकिन यह बहुत तेज़ है (मेरी मशीन पर 1.6 मिलियन रिकॉर्ड के साथ 0.005 सेकंड।)
--Original animal
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 0 "level" from animals where animal_id = '101'
union all
--Parents
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 1 "level" from animals
where animal_id = (select sire_animal_id from animals where animal_id = '101')
union all
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 1 "level" from animals
where animal_id = (select dam_animal_id from animals where animal_id = '101')
union all
--Grand parents
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
where animal_id =
(
select sire_animal_id from animals
where animal_id = (select sire_animal_id from animals where animal_id = '101')
)
union all
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
where animal_id =
(
select dam_animal_id from animals
where animal_id = (select sire_animal_id from animals where animal_id = '101')
)
union all
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
where animal_id =
(
select sire_animal_id from animals
where animal_id = (select dam_animal_id from animals where animal_id = '101')
)
union all
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
where animal_id =
(
select dam_animal_id from animals
where animal_id = (select dam_animal_id from animals where animal_id = '101')
);