के रूप में दूसरों की है (अधिकतर) सही ढंग से कहा गया है एक त्रुटि प्राप्त होगी, एसक्यूएल में WHERE
खंड, SELECT
खंड से पहले मूल्यांकन किया जाता है इसलिए एक सेट समारोह का परिणाम WHERE
खंड में 'क्षेत्र से बाहर' है।
उदाहरण के लिए, आप ऐसा नहीं कर सकते:
SELECT Subject, MAX(Mark) AS TopScore
FROM Exam_Marks
GROUP
BY Subject
WHERE TopScore <= 70;
क्योंकि स्तंभ सहसंबंध नाम TopScore
WHERE
खंड के लिए दायरे में नहीं है।
SELECT DT1.TopScore
FROM (
SELECT Subject, MAX(Mark) AS TopScore
FROM Exam_Marks
GROUP
BY Subject
) AS DT1
WHERE DT1.TopScore <= 70;
समस्या थी, एसक्यूएल के प्रारंभिक कार्यान्वयन (आईबीएम की प्रणाली अनुसंधान के साथ शुरू), व्युत्पन्न तालिकाओं के लिए समर्थन का अभाव है इसलिए unintuitive HAVING
पैदा हुआ था:
बेशक हम एक सबक्वेरी इस्तेमाल कर सकते हैं
।
आप ह्यूग डार्वेन द्वारा HAVING A Blunderful Time (or Wish You Were WHERE) में पूरी खेद की कहानी पढ़ सकते हैं, जिसमें से मैंने उपर्युक्त उदाहरण उधार लिया है।
डैनियल के उत्तर को एक और तरीके से रखने के लिए, परिणाम सेट में सभी पंक्तियों पर जहां खंड लागू होता है। क्लॉज द्वारा समूह द्वारा बनाए गए समूहों पर होने वाला खंड लागू होता है। इसलिए यदि आपके समूह में आपके उदाहरण में कॉलम 1 शामिल है और शर्तें कॉलम 1 पर थीं, तो यह कहां समान है, क्योंकि पंक्ति "समूह" के समान ही है। – Anon246
@Strommy: बिल्कुल। और यदि किसी कारण से आप 'हैविंग' का उपयोग नहीं करना चाहते हैं, तो आप एक वांछित 'चयन' का उपयोग कर और वांछित भविष्य को व्यक्त करने के लिए बाहरी 'WHERE' खंड का उपयोग करके एक ही चीज़ को पूरा कर सकते हैं। –