2010-05-05 15 views
9

यह हमेशा मुझे परेशान करता है - एसक्यूएल कथन में ग्रुप बाय क्लॉज की आवश्यकता क्यों है कि मैं सभी गैर-कुल कॉलम शामिल करता हूं? इन कॉलम को डिफ़ॉल्ट रूप से शामिल किया जाना चाहिए - एक प्रकार का "ग्रुप बाय *" - क्योंकि मैं क्वेरी को तब तक नहीं चला सकता जब तक वे सभी शामिल नहीं होते हैं। प्रत्येक कॉलम को या तो कुल मिलाकर "ग्रुप बाय" में निर्दिष्ट किया जाना चाहिए, लेकिन ऐसा लगता है कि समेकित कुछ भी स्वचालित रूप से समूहीकृत नहीं होना चाहिए।मुझे SQL "ग्रुप बाय" खंड में सभी कॉलम स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता क्यों है - क्यों "ग्रुप बाय *" नहीं?

शायद यह एएनएसआई-एसक्यूएल मानक का हिस्सा है, लेकिन फिर भी, मुझे समझ में नहीं आता क्यों। क्या कोई मुझे इस सम्मेलन की आवश्यकता को समझने में मदद कर सकता है?

+0

संबंधित http://stackoverflow.com/questions/416625/why-does-sql-force-me-to-repeat-all-non-aggregated-fields-from-my-select-clause-i –

+0

आह - यह एक डुप्लिकेट है। मैं इस सवाल को बंद कर दूंगा। – SqlRyan

+1

यह एक बहुआयामी है: http://stackoverflow.com/questions/2311034/is-sql-group-by-a-design-flaw – cindi

उत्तर

19

यह जानना मुश्किल है कि SQL भाषा के डिजाइनर मानक, लिखते समय क्या सोच रहे थे, लेकिन मेरी राय है।

एसक्यूएल, एक सामान्य नियम के रूप में, आपको अपनी अपेक्षाओं और आपके इरादे को स्पष्ट रूप से बताने की आवश्यकता है। भाषा "अनुमान लगाने का अनुमान नहीं है", और स्वचालित रूप से रिक्त स्थान भरें। यह एक अच्छी बात है

जब आप कोई प्रश्न लिखते हैं तो सबसे महत्वपूर्ण विचार यह है कि सही परिणाम उत्पन्न करता है। यदि आपने कोई गलती की है, तो शायद यह बेहतर है कि एसक्यूएल पार्सर आपको अपने इरादे के बारे में अनुमान लगाने और सही न होने वाले परिणामों को वापस करने के बजाय आपको सूचित करता है। एसक्यूएल की घोषणात्मक प्रकृति (जहां आप बताते हैं कि आप इसे पुनर्प्राप्त करने के चरणों के बजाय पुनर्प्राप्त करना चाहते हैं) पहले से ही अनजाने में गलतियों को करना आसान बनाता है। भाषा वाक्यविन्यास में फ़ज़ीनियों को पेश करने से यह बेहतर नहीं होगा

असल में, हर मामले में मैं सोच सकता हूं कि भाषा शॉर्टकट के लिए अनुमति देती है। उदाहरण के लिए, प्राकृतिक जुड़ें - जहां आप उन स्तंभों के नामों को छोड़ सकते हैं जिन्हें आप शामिल करना चाहते हैं और डेटाबेस नामों के आधार पर डेटाबेस को अनुमान लगाने की अनुमति दें। एक बार कॉलम नाम बदल जाते हैं (जैसे वे स्वाभाविक रूप से समय के साथ करते हैं) - मौजूदा प्रश्नों के अर्थशास्त्र उनके साथ बदलते हैं। यह बुरा है ... बहुत बुरा - आप वास्तव में इस तरह के जादू अपने डेटाबेस कोड में दृश्यों के पीछे हो रहा है।

हालांकि, इस डिजाइन विकल्प का एक परिणाम यह है कि एसक्यूएल एक वर्बोज़ भाषा है जिसमें आपको स्पष्ट रूप से अपना इरादा व्यक्त करना होगा। इसका परिणाम आपको जितना चाहें उतना कोड लिखना पड़ सकता है, और कुछ संरचनाएं इतनी वर्बोज़ क्यों होती हैं ... लेकिन दिन के अंत में - यह वही है।

0

यह इस तरह आसान है: आपने क्लॉज से प्रत्येक कॉलम द्वारा परिणाम समूह को एसक्यूएल करने के लिए कहा है, जिसका मतलब धारा एसक्यूएल से प्रत्येक कॉलम के लिए है, एसक्यूएल इंजन आंतरिक रूप से इसे प्रस्तुत करने के पहले परिणाम सेट को समूहित करेगा आप। इसलिए यह बताता है कि यह आपको यहां से मौजूद सभी कॉलम का उल्लेख करने के लिए क्यों कहता है क्योंकि यह संभवतः समूह को आंशिक रूप से नहीं दिखाता है। यदि आपने खंड द्वारा समूह का उल्लेख किया है तो सभी कॉलम को समूहीकृत करके अपने इरादे को प्राप्त करने के लिए केवल एसक्यूएल संभव है। यह एक गणित प्रतिबंध है।

0

एकमात्र तार्किक कारण है कि मैं GROUP BY खंड को रखने के बारे में सोच सकता हूं क्योंकि यह है कि आप उन फ़ील्ड को शामिल कर सकते हैं जो आपके समूह में आपके चयन कॉलम में शामिल नहीं हैं।

उदाहरण के लिए।

Select column1, SUM(column2) AS sum 
FROM table1 
GROUP BY column1, column3 

भले ही कॉलम 3 क्वेरी में कहीं और प्रदर्शित नहीं किया गया है, फिर भी आप इसके मूल्य से परिणाम समूह कर सकते हैं। (निश्चित रूप से एक बार ऐसा करने के बाद, आप परिणाम से नहीं बता सकते कि रिकॉर्ड क्यों समूहित किए गए थे।)

यह बेहद आम परिदृश्य के लिए एक सरल शॉर्टकट जैसा प्रतीत होता है (प्रत्येक गैर- कुल कॉलम) कोडिंग को तेज करने के लिए एक सरल लेकिन प्रभावी उपकरण होगा।

शायद "GROUP BY *"

के बाद से यह पहले से ही अभी भी उपयोगकर्ता के लिए स्वचालित रूप से अनुमति देने के लिए सक्षम होने के लिए बहुत आम में एसक्यूएल उपकरण परिणाम स्तंभ संख्या से स्तंभों के लिए संदर्भ अनुमति देने के लिए (यानी। GROUP BY 1,2,3, आदि) यह सरल प्रतीत होता है एक कीस्ट्रोक में सभी गैर-समेकित फ़ील्ड शामिल करें।

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