ग्रुप बाय में वाइल्डकार्ड क्यों नहीं काम करते हैं?


29

मैं निम्नलिखित एसक्यूएल स्टेटमेंट को काम करने की कोशिश कर रहा हूं, लेकिन मुझे एक सिंटैक्स त्रुटि मिलती है:

SELECT A.*, COUNT(B.foo)
FROM TABLE1 A
LEFT JOIN TABLE2 B ON A.PKey = B.FKey
GROUP BY A.*

यहां, ए 40 स्तंभों वाली एक विस्तृत तालिका है और यदि संभव हो तो मैं ग्रुप बीओ क्लॉज में प्रत्येक कॉलम नाम को सूचीबद्ध करने से बचना चाहूंगा। मेरे पास कई ऐसे टेबल हैं जिन पर मुझे एक समान क्वेरी चलानी है, इसलिए मुझे एक संग्रहीत प्रक्रिया लिखनी होगी। इसके लिए सबसे अच्छा तरीका क्या है?

मैं MS SQL Server 2008 का उपयोग कर रहा हूं।

जवाबों:


32

GROUP BY A.* SQL में अनुमति नहीं है।

जहाँ आप समूह बनाते हैं, वहां एक उप-वर्ग का उपयोग करके आप इसे बायपास कर सकते हैं और फिर शामिल हो सकते हैं:

SELECT A.*, COALESCE(B.cnt, 0) AS Count_B_Foo
FROM TABLE1 AS A
  LEFT JOIN 
      ( SELECT FKey, COUNT(foo) AS cnt
        FROM TABLE2 
        GROUP BY FKey
      ) AS B 
    ON A.PKey = B.FKey ;

SELECTसूची में अनुमति देने के लिए SQL-2003 मानक में एक विशेषता है , कॉलम जो GROUP BYसूची में नहीं हैं , जब तक वे कार्यात्मक रूप से उन पर निर्भर हैं। यदि वह सुविधा SQL-Server में लागू की गई थी, तो आपकी क्वेरी को इस तरह लिखा जा सकता है:

SELECT A.*, COUNT(B.foo)
FROM TABLE1 A
LEFT JOIN TABLE2 B ON A.PKey = B.FKey
GROUP BY A.pk                          --- the Primary Key of table A

दुर्भाग्य से, यह सुविधा अभी तक लागू नहीं हुई है, यहां तक ​​कि एसक्यूएल-सर्वर 2012 संस्करण में भी नहीं - और किसी अन्य डीबीएमएस में नहीं, जहां तक ​​मुझे पता है। MySQL के अलावा जो इसमें है लेकिन अपर्याप्त रूप से (अपर्याप्त रूप से: उपरोक्त क्वेरी काम करेगी लेकिन इंजन कार्यात्मक निर्भरता के लिए कोई जाँच नहीं करेगा और अन्य बीमार लिखित प्रश्न गलत, अर्ध-यादृच्छिक परिणाम दिखाएंगे)।

जैसा कि @Mark Byers ने हमें एक टिप्पणी में सूचित किया, PostgreSQL 9.1 ने इस उद्देश्य के लिए डिज़ाइन किया गया एक नया फीचर जोड़ा । यह MySQL के कार्यान्वयन से अधिक प्रतिबंधात्मक है।


क्या आप RDBMS के एक जोड़े का उल्लेख कर सकते हैं जो लिखित रूप में मानक के उस हिस्से को लागू करता है? मुझे पता है, उदाहरण के लिए, कि MySQL आपको सूची में दिए गए GROUP BYखंड में शामिल नहीं होने वाली वस्तुओं को शामिल करने के लिए (उचित सेटिंग्स दिए जाने की अनुमति देगा) SELECT, लेकिन यह इसे अपरिभाषित छोड़ देता है कि यह मान किस पंक्ति से आएगा (इसलिए यदि स्तंभ या अभिव्यक्ति isn है 'टी कार्यात्मक समूहीकरण अभिव्यक्ति पर निर्भर है, तो यह हो सकता है समूह के भीतर किसी भी पंक्ति से आते हैं)।
एडम रॉबिन्सन

@ एडम: नहीं, मुझे नहीं पता कि कोई आरडीबीएमएस है जिसने इसे लागू किया है। MySQL के पास यह है लेकिन अपर्याप्त रूप से, जैसा कि आपकी टिप्पणी कहती है।
ypercube y

पकड़ लिया। मैं वास्तव में पूछ रहा था कि क्या वहाँ थे, क्योंकि मेरे पास आरडीबीएमएस से बहुत कम अनुभव है, क्योंकि मैं कल्पना करूंगा कि इस साइट पर सवालों के जवाब देने वाले अधिकांश लोगों के पास होगा;) लेकिन यह मेरा संदेह था।
एडम रॉबिन्सन

3
"जहाँ तक मुझे पता है किसी और DBMS में नहीं।" PostgreSQL 9.1 ने इस उद्देश्य के लिए डिज़ाइन किया गया एक नया फीचर जोड़ा । यह MySQL के कार्यान्वयन से अधिक प्रतिबंधात्मक है।
मार्क बायर्स

@ मार्कर्स: thnx, मुझे नहीं पता था कि।
ypercube y

24

@ Ypercube के वर्कअराउंड के अलावा, "टाइपिंग" कभी भी उपयोग करने का बहाना नहीं है SELECT *। मैंने इसके बारे में यहां लिखा है , और यहां तक ​​कि मुझे लगता है कि वर्कअराउंड के साथ आपकी SELECTसूची में अभी भी कॉलम नाम शामिल होने चाहिए - भले ही 40 जैसी भारी संख्या हो।

लंबी कहानी छोटी, आप अपनी क्वेरी विंडो पर ऑब्जेक्ट एक्सप्लोरर में ऑब्जेक्ट के लिए कॉलम नोड पर क्लिक करके और खींचकर इन बड़ी सूचियों को टाइप करने से बच सकते हैं। स्क्रीन शॉट एक दृश्य दिखाता है लेकिन एक टेबल के लिए एक ही काम किया जा सकता है।

यहां छवि विवरण दर्ज करें

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


PostgreSQL (ईएमएस SQL ​​प्रबंधक के साथ) में, मैं इसे एक दृश्य के रूप में परिभाषित करता हूं SELECT *और फिर दृश्य परिभाषा से फ़ील्ड सूची की प्रतिलिपि बनाता हूं ।
dezso

मैं निश्चित रूप से सहमत हूं कि SELECT *इसका उपयोग नहीं किया जाना चाहिए। मैं GROUP BYहालांकि इस मामले को लेकर उत्सुक हूं । @Aaron, क्या समूह की सूची में 40 कॉलम होने के साथ दक्षता के मुद्दे हैं?
ypercube y

1
@ypercube - जहाँ तक मैंने देखा है अगर आप A.PK, A.some, A.other, A.columnsइसके द्वारा समूह बनाते हैं तो वास्तव में some, other, columnsयह तुलना करने की जहमत नहीं उठाता है, सिंटैक्स की आवश्यकता है।
मार्टिन स्मिथ

1
@datagod क्षमा करें, नहीं, कोई भी अंतराल केवल SSMS देव टीम द्वारा समझाया जा सकता है। :-)
हारून बर्ट्रेंड

1
@Pacerier क्षमा करें, मैं पूरी तरह से असहमत हूं , लेकिन शायद आप विस्तार से बता सकते हैं।
हारून बर्ट्रेंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.