2012-02-12 14 views
127

मैं दो टेबल है:एसक्यूएल - वी.एस. होने जहां

1. Lecturers (LectID, Fname, Lname, degree). 
2. Lecturers_Specialization (LectID, Expertise). 

मैं सबसे विशेषज्ञता के साथ व्याख्याता लगाना चाहते हैं। जब मैं यह कोशिश है, यह काम कर रहा है नहीं:

SELECT 
    L.LectID, 
    Fname, 
    Lname 
FROM Lecturers L, 
    Lecturers_Specialization S 
WHERE L.LectID = S.LectID 
AND COUNT(S.Expertise) >= ALL (SELECT 
    COUNT(Expertise) 
FROM Lecturers_Specialization 
GROUP BY LectID); 

लेकिन जब मैं यह कोशिश, यह काम करता है:

SELECT 
    L.LectID, 
    Fname, 
    Lname 
FROM Lecturers L, 
    Lecturers_Specialization S 
WHERE L.LectID = S.LectID 
GROUP BY L.LectID, 
     Fname, 
     Lname 
HAVING COUNT(S.Expertise) >= ALL (SELECT 
    COUNT(Expertise) 
FROM Lecturers_Specialization 
GROUP BY LectID); 

कारण क्या है? धन्यवाद।

+2

आप स्पष्ट कर सकते हैं एसक्यूएल का कौन सा संस्करण (MySQL, एमएस एसक्यूएल, PostgreSQL, ओरेकल, आदि) का उपयोग कर रहे हैं। साथ ही, जब आप कहते हैं कि "काम नहीं कर रहा है", तो क्या आपका मतलब यह नहीं है कि परिणाम आप अपेक्षा करते हैं, या कोई संकलन/पार्स त्रुटि है? – jklemmack

+1

आप MAX के बजाय सभी का उपयोग क्यों करते हैं? क्या कोई फायदा है? – skan

उत्तर

237

WHERE खंड व्यक्तिगत पंक्तियों पर एक शर्त प्रस्तुत करता है; HAVING खंड एग्रीगेशंस पर एक शर्त प्रस्तुत करता है, यानी चयन के परिणाम जहां गणना, औसत, न्यूनतम, अधिकतम या योग जैसे एकल परिणाम एकाधिक पंक्तियों से उत्पादित किए गए हैं। आपकी क्वेरी दूसरी प्रकार की स्थिति के लिए कॉल करती है (यानी एकत्रीकरण पर एक शर्त) इसलिए HAVING सही तरीके से काम करता है।

अंगूठे के नियम के रूप में, GROUP BY और HAVINGGROUP BY के बाद WHERE का उपयोग करें। यह एक आदिम नियम है, लेकिन यह 90% से अधिक मामलों में उपयोगी है।

SELECT L.LectID, Fname, Lname 
FROM Lecturers L 
JOIN Lecturers_Specialization S ON L.LectID=S.LectID 
GROUP BY L.LectID, Fname, Lname 
HAVING COUNT(S.Expertise)>=ALL 
(SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID) 

यह WHERE कि थीटा हालत में शामिल होने के एक के रूप में इस्तेमाल किया गया था को खत्म होगा:

आप उस पर होते हैं, तो आप में शामिल होने की एएनएसआई संस्करण का उपयोग आपकी क्वेरी को फिर से लिखने के लिए कर सकते हैं।

31

HAVING कुल योग पर कार्य करता है। चूंकि COUNT एक समग्र कार्य है, इसलिए आप इसे WHERE खंड में उपयोग नहीं कर सकते हैं।

Here's कुल कार्यों पर एमएसडीएन से कुछ पढ़ने।

8

आप कुल कार्यों के साथ खंड कहां उपयोग नहीं कर सकते हैं क्योंकि स्थिति के आधार पर रिकॉर्ड प्राप्त करते हैं, यह रिकॉर्ड द्वारा तालिका रिकॉर्ड में जाता है और फिर हमारे द्वारा दी गई स्थिति के आधार पर रिकॉर्ड प्राप्त करता है। तो उस समय हम खंड नहीं कर सकते हैं। परिणाम होने पर क्लॉज काम करता है, जबकि हम अंत में एक क्वेरी चलाने के बाद मिलता है।

उदाहरण क्वेरी:

select empName, sum(Bonus) 
from employees 
order by empName 
having sum(Bonus) > 5000; 

यह एक अस्थायी स्मृति में ResultSet स्टोर करेगा, तो होने खंड अपने काम प्रदर्शन करेंगे। तो हम यहां आसानी से कुल कार्यों का उपयोग कर सकते हैं।

+1

मुझे लगता है कि हम ग्रुप बाय क्लॉज के बिना हैविंग क्लॉज का उपयोग नहीं कर सकते हैं। हैविंग क्लॉज की स्थिति - चुनें -> से -> कहां -> ग्रुप बाय -> हैविंग -> ऑर्डर – Ronnie

8
  1. कहां खंड, का चयन करें, सम्मिलित करें, और अद्यतन बयान के साथ इस्तेमाल किया जा होने से SELECT कथन के साथ ही इस्तेमाल किया जा सकता है, जबकि।

  2. जहां एकत्रीकरण (ग्रुप बाय) से पहले पंक्तियों को फ़िल्टर करता है, जबकि एकत्रीकरण के बाद हैविंग फ़िल्टर समूह प्रदर्शन किए जाते हैं।

  3. WHERE क्लॉज में कुल फ़ंक्शन का उपयोग नहीं किया जा सकता है जब तक कि यह हैविंग क्लॉज में निहित उपकुंजी में न हो, जबकि कुल कार्यों का उपयोग HAVING खंड में किया जा सकता है।

Source

2

1. हम कहां खंड उदा नहीं खंड होने के साथ एकीकृत फ़ंक्शन का उपयोग कर सकते न्यूनतम अधिकतम औसत।

2. कहां खंड टपल HAVING क्लॉज़ द्वारा रिकॉर्ड टपल समाप्त समूह के संग्रह से पूरे समूह को समाप्त

अधिकतर रखने से आपको डेटा के समूहों है और आप पंक्तियों में डेटा है जब कहां प्रयोग किया जाता है जब प्रयोग किया जाता है ।

4

एक क्वेरी में दोनों का एक उदाहरण नहीं देखा। तो यह उदाहरण मदद कर सकता है।

/** 
INTERNATIONAL_ORDERS - table of orders by company by location by day 
companyId, country, city, total, date 
**/ 

SELECT country, city, sum(total) totalCityOrders 
FROM INTERNATIONAL_ORDERS with (nolock) 
WHERE companyId = 884501253109 
GROUP BY country, city 
HAVING country = 'MX' 
ORDER BY sum(total) DESC 

यह companyId से पहले तालिका फिल्टर, तो समूह यह (देश और शहर के द्वारा) और साथ ही यह नीचे मैक्सिको की सिर्फ शहर एकत्रित करने के लिए फिल्टर। कंपनी आईडी को एकत्रीकरण में जरूरी नहीं था, लेकिन हम ग्रुप बाय का उपयोग करने से पहले केवल पंक्तियों को फ़िल्टर करने के लिए WHERE का उपयोग करने में सक्षम थे।

6

सबसे पहले हमें क्लॉज i.e > जहां> ग्रुप बाय> हैविंग> डिस्टिंट> चयन> ऑर्डर द्वारा निष्पादन के आदेश को जानना चाहिए। के बाद से जहां खंड द्वारा खण्ड ग्रुप से पहले मार डाला जाता है रिकॉर्ड लागू करने के लिए जहां एक ग्रुप को द्वारा लागू रिकॉर्ड द्वारा फ़िल्टर नहीं किया जा सकता है।

"हैविंग WHERE क्लॉज के समान है लेकिन समूहबद्ध रिकॉर्ड पर लागू होता है"।

पहले कहां खंड रिकॉर्ड तब द्वारा समूह के खंड तदनुसार समूहों उन्हें स्थिति के आधार पर और फिर होने खंड समूह होने शर्त के आधार पर रिकॉर्ड को हासिल करेगा को हासिल करेगा।

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