sql - SELECT .. FROM (SELECT .. FROM ..). How can I improve this query? -
इस सवाल का पहले से ही एक उत्तर है: < / p>
- 26 उत्तरों
मैं एसक्यूएल सीख रहा हूँ और GalaXQL ऐप के अध्यायों के माध्यम से जा रहे हैं।
मैंने "क्वार्टर के स्टार (या स्टार)" के उत्तर में निम्नलिखित प्रश्न लिखा है, जिसमें ग्रह को आकाशगंगा में सर्वोच्च कक्षा की दूरी है प्रारंभ से पहले पुरानी भयावहता को साफ करने के लिए याद रखें। "
यह क्वेरी परिणाम starid देता है: 23334, जब hilight तालिका में डाला, मुझे प्रगति के लिए अनुमति देता है हालांकि, इस परिणाम को मेरे सामने वापस सौंपने से पहले प्रोग्राम लांग, लंबे समय तक लटका हुआ है, इसलिए मुझे संदेह है कि यह जानकारी डेटाबेस से खींचने के लिए एक बहुत अधिक कुशल तरीका है।
यह क्वेरी काम करती है, लेकिन प्रक्रिया करने में अधिक समय लगता है, मैं इस प्रश्न को कैसे बेहतर कर सकता / सकती हूं?
हिलेक्ट का चयन करें चयन एसआईटीएस में ग्रहों से तारों से पी, सितारों के रूप में एस, चंद्रमा के रूप में एम एस एस एस स्टारडाइज = (ग्रहों से तारों का चयन करें जहां कक्षा की कक्षाएं) () (कक्षा से चयन करें MAX (ऑर्बिटडिस्टेंस));
इस क्वेरी संरचना के पीछे मेरा तर्क
प्रथम तालिका से सबसे बड़ी कक्षा दूरी के साथ ग्रह को ढूंढें "ग्रहों"। तालिका "ग्रहों" के "ऑर्बिटडिस्टन्स" फ़ील्ड में "उच्चतम कक्षा दूरी" के मूल्य की तुलना करने के लिए
दूसरा और संबंधित "स्टारिड" को वापस करने के लिए तालिका "तारों" में तालिका "ग्रहों" को फ़ील्ड "starid" में "starid" के मूल्य की तुलना करने के लिए
तीसरे और फिर डालें कि "starid" तालिका "hilight"।
डेटा संरचना:
ठीक है, अपनी आधार क्वेरी को देखकर शुरू करें। मुझे पता है कि आपके पास पहले से एक उत्तर है जो काम करता है लेकिन मुझे लगता है कि मुझे आपको यह समझा जाना चाहिए कि आपकी क्वेरी में क्या चल रहा था।
ग्रहों में चयन करें, जैसे ग्रहों से पीले सितारों के रूप में पी, सितारों के रूप में सितारों, चंद्रमा के रूप में एम.एस.एस. स्टारडाइंड = (ग्रहों से ग्रहण करें, जहां कक्षा की कक्षाएं चुनें (= चुनें MAX (orbitdistance) से) ग्रह));
तो यहां आपके
FROM खंड में आप कई पुराने शैली में शामिल हो रहे हैं आपके पास एक
चालू खंड नहीं है इसे एक कार्टेशियन उत्पाद के रूप में संदर्भित किया जाता है, जो इसे दर्शाता है। नतीजतन, पहली तालिका में पंक्तियों की संख्या दूसरी तालिका में पंक्तियों की संख्या से गुणा होती है और इतने पर और इसी तरह।
इसलिए हम इसे ठीक कर सकते हैं बस जोड़ वाक्यविन्यास को ठीक करने और आपके चित्र में दिखाए गए रिश्तों
में छापें चुनें - DISTINCT शायद अब जरूरी नहीं है क्योंकि हम कलात्मक रूप से डुप्लिकेट पंक्तियों को नहीं बनाते हैं। ग्रहों से एस.एस. तारांकन के रूप में पी इन में भी शामिल होते हैं जैसे s.StarID = p.starid अंदरूनी चन्द्रमाओं के रूप में एम एम। प्लानेटआईडी = पी। प्लानेटिड जहां एस। स्टारडियड = (ग्रहों से तारों का चयन करें जहां कक्षा की कक्षाएं) (यानी कक्षा से चुनें) (कक्षा का चयन करें)); आगे के विश्लेषण पर आप तालिका के चंद्रमा में शामिल हो रहे हैं, लेकिन आप किसी भी डेटा का उपयोग नहीं कर रहे हैं और न ही यह आपके परिणाम सेट को सीमित कर रहा है। इसका अर्थ है कि आप अपनी क्वेरी में इसे होने से कोई फायदा नहीं प्राप्त कर रहे हैं और इसे ठीक से बाहर कर सकते हैं।
हिलेक्ट का चयन करें - DISTINCT में अब आवश्यकता नहीं है क्योंकि हम कलात्मक रूप से नहीं बना रहे हैं डुप्लिकेट पंक्तियों s.starid से ग्रहों के रूप में पी भीतरी सितारे के रूप में एस एस। स्टारड = पी स्टारस्टीड पर एस एस स्टारडाइड = (ग्रहों से ग्रहण करें जहां कक्षा की कक्षा से चुनें) (कक्षा से चयन करें MAX (orbitdistance));
अब आगे के विश्लेषण पर यदि हम आपके
WHERE खंड को देखते हैं तो ऐसा लगता है कि यह बहुत बेमानी है मुझे ग्रह तालिका की मेज से अधिकतम कक्षा की दूरी से मेल खाने के लिए जब आप अपनी विधेय को प्राप्त करने के लिए दो बार दोबारा ग्रह तालिका में जाने का कोई कारण नहीं होने लगता है। यह टेबल सारणी में शामिल होने के किसी भी कारण को भी समाप्त कर देता है।
ग्रहों से चयन करें p.starid के रूप में ग्रहों के रूप में पी। P.orbitdistance = (ग्रहों से चुनें MAX (orbitdistance))
परिणामस्वरूप क्वेरी बहुत सरल है और अब बहुत तेजी से चलनी चाहिए कि हम इतने सारे डुप्लिकेट पंक्तियाँ नहीं पैदा कर रहे हैं मुझे आशा है कि आपकी क्वेरी में जो कुछ हो रहा है, उसके बारे में कुछ प्रकाश डाला जाता है।
अद्यतन करें: आगे की समीक्षा पर यह गैला एसक्यूएल काफी भयानक प्रतीत होता है और बड़ी मात्रा में पुरानी जानकारी है और मैं इसे अत्यधिक उपयोग नहीं करने की अनुशंसा करता हूं।
Comments
Post a Comment