मेरे लिए नंबर एक अंतर: यदि HAVING
एसक्यूएल भाषा से हटा दिया गया था तो जीवन पहले की तरह कम या ज्यादा हो जाएगा। निश्चित रूप से, एक अल्पसंख्यक प्रश्नों को एक व्युत्पन्न तालिका, सीटीई, आदि का उपयोग करके फिर से लिखना होगा, लेकिन परिणामस्वरूप वे समझने और बनाए रखने में आसान होंगे। हो सकता है कि विक्रेताओं के आशावादी कोड को इसके लिए फिर से लिखना पड़े, फिर से उद्योग के भीतर सुधार का अवसर मिले।
अब WHERE
भाषा से हटाने के लिए एक क्षण पर विचार करें । इस बार अस्तित्व में मौजूद अधिकांश प्रश्नों को एक स्पष्ट वैकल्पिक निर्माण के बिना फिर से लिखना होगा। कोडर्स को क्रिएटिव प्राप्त करना होगा जैसे कि एक तालिका में शामिल होने के लिए आंतरिक रूप से जाना जाता है, जिसमें पूर्व पंक्ति (जैसे DUAL
ओरेकल) ON
में पूर्व WHERE
खंड को अनुकरण करने के लिए क्लॉज का उपयोग किया जाता है । इस तरह के निर्माणों से वंचित किया जाएगा; यह स्पष्ट होगा कि भाषा से कुछ गायब था और परिणामस्वरूप स्थिति बदतर होगी।
टीएल; डीआर हम HAVING
कल खो सकते हैं और चीजें बदतर नहीं होंगी, संभवतः बेहतर होंगी, लेकिन उसी के बारे में नहीं कहा जा सकता है WHERE
।
यहाँ के जवाबों से, ऐसा लगता है कि बहुत से लोगों को यह पता ही नहीं है कि एक HAVING
खंड का उपयोग एक GROUP BY
खंड के बिना किया जा सकता है । इस स्थिति में, HAVING
खंड को संपूर्ण तालिका अभिव्यक्ति पर लागू किया जाता है और इसके लिए आवश्यक है कि SELECT
खंड में केवल स्थिरांक दिखाई दें । आमतौर पर इस HAVING
खंड में समुच्चय शामिल होंगे।
यह जितना लगता है उससे अधिक उपयोगी है। उदाहरण के लिए, इस क्वेरी पर विचार करें कि क्या यह परीक्षण name
सभी मानों के लिए अद्वितीय है T
:
SELECT 1 AS result
FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );
केवल दो संभावित परिणाम हैं: यदि HAVING
खंड सत्य है तो परिणाम एकल पंक्ति वाला होना चाहिए जिसमें मान हो1
, अन्यथा परिणाम खाली सेट होगा।
HAVING
एक पोस्ट-एकत्रीकरण फ़िल्टर है, जबकिWHERE
एक पूर्व-एकत्रीकरण फ़िल्टर है।