2012-12-01 29 views
5

अब डेटा खींच सकता है, लेकिन मुझे आश्चर्य है कि बड़े डेटा सेट के लिए क्वेरी को अनुकूलित करने का बेहतर तरीका है या नहीं।पदानुक्रमित प्रश्नों को बच्चों, माता-पिता और भाई बहनों को खींचने की ज़रूरत है

http://sqlfiddle.com/#!4/0ef0c/5

तो बुनियादी तौर पर मैं जिज्ञासा दिए हुए ऑर्ग आईडी आपूर्ति करने में सक्षम होना चाहता हूँ और यह रिकर्सिवली अपने माता-पिता, अपने बच्चों, अपने भाई बहन और उसके चाची और चाचा खींच दिया है। और उसके बाद उस संगठन पदानुक्रम से जुड़े किसी भी क्रियाकलाप को खींचें।

संगठन 1 शीर्ष स्तर संगठन है, लेकिन यह एक शून्य मूल हो सकता है या नहीं हो सकता है।

मूल रूप से मैं बच्चों और अभिभावकों को खींचने के लिए ऊपर और नीचे की क्वेरी कर रहा था, लेकिन केवल एक और प्रश्न जोड़कर भाई बहनें ही मिल सकती हैं। आखिरकार एक दोस्त की मदद से एक और सवाल उठ गया, लेकिन बड़े डेटा सेट (4-5k गतिविधियां) पर बहुत कम है।

किसी भी अंतर्दृष्टि बहुत सराहना की जाएगी।

+0

यदि आप एक पहेली बनाने की परेशानी के लिए गए हैं, तो एक लिंक आसान होगा। – Laurence

+0

इसके बारे में क्षमा करें। http://sqlfiddle.com/#!4/5310d/5/0 –

+0

हां, यह स्पष्ट होने में मदद करता है। नतीजतन, यह तीसरी बार है जब आपने जो खींच लिया है उसे नई जानकारी जोड़ दी है। रहने भी दो। – REW

उत्तर

0

यदि आपका संगठन। संरचना सख्ती से पदानुक्रमित है, तो आप इस दृष्टिकोण का उपयोग कर सकते हैं: http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html

दोष यह है कि आपको संगठन संरचना के प्रत्येक अद्यतन पर सूचकांक को अद्यतन करना होगा। हालांकि संगठन संरचनाओं को आम तौर पर संशोधित किया जाता है। तो आईएमएचओ यह चाल करना चाहिए।

0

ऐसा करने की कुंजी "रिकर्सिवली" शब्द में है। ऐसा करने के लिए, एक प्रक्रिया बनाएं जो स्वयं को कॉल करे। यह माता-पिता के लिए एक उदाहरण है, लेकिन क्योंकि यह प्रविष्टियों के माध्यम से स्क्रॉल करने के लिए कर्सर का उपयोग कर रहा है, यह बच्चों और अन्य रिश्तों को शामिल करने के लिए इसका उपयोग करने के लिए सरल होना चाहिए।

CREATE OR REPLACE PROCEDURE find_parents( 
    org_id NUMBER, 
    lvl NUMBER DEFAULT 1) AS 

    c_parent table1.id%TYPE; 
    c_name table1.name%TYPE; 
    CURSOR c_parents (c_id table1.id%TYPE) IS 
    SELECT parent, name FROM table1 WHERE (id = c_id); 

    BEGIN 
    dbms_output.put('-'); 
    OPEN c_parents(org_id); 
    LOOP 
     FETCH c_parents INTO c_parent, c_name; 
     EXIT WHEN c_parents%notfound; 
     dbms_output.put_line('Level ' || lvl || ' parent: [ID: ' || c_parent || ', NAME: ' || c_name || ']'); 
     find_parents(c_parent, lvl + 1); 
    END LOOP; 
    CLOSE c_parents; 
    END; 
+0

यह नियमित पदानुक्रमिक क्वेरी में व्यवहार्य होना चाहिए - कोई प्रक्रिया आवश्यक नहीं है। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^