2015-10-30 7 views
5

हम पंक्ति के समूह को फ़िल्टर करने के लिए एसक्यूएल-क्वेरी में हैविंग क्लॉज का उपयोग करने में सक्षम हैं। जब हम ग्रुप बाय क्लॉज का उपयोग करते हैं तो यह सीधे इस तरह से काम करता है।हैविंग क्लॉज वास्तव में कैसे काम करता है?

लेकिन, चलो इस क्वेरी के लिए देखो:

select 1 where 1!=1 having count(*)=0; 

(या Oracle के लिए 'दोहरी से' के साथ संलग्न)।

यदि वास्तव में समूह निस्पंदन करते हैं, तो हमारे पास कोई पंक्ति नहीं है, इसलिए हमारे पास कोई समूह नहीं है और परिणाम 'कोई पंक्ति चयनित नहीं' होनी चाहिए।

लेकिन पोस्टग्रेएसक्यूएल में, माईएसक्यूएल और ओरेकल में हमें क्वेरी के परिणामस्वरूप '1' मिलता है।

प्रश्न: हैविंग वास्तव में कैसे काम करता है?

एसक्यूएल परीक्षण के लिए फिडल: http://www.sqlfiddle.com/#!15/d5407/51

+0

बेवकूफ तरीके से ... – jarlh

+0

कहां वापसी 0 पंक्तियां, इसलिए हमारे पास पंक्तियों के 0 समूह हैं।यदि हैविंग केवल पंक्ति समूह निस्पंदन करते हैं, तो खाली इनपुट के लिए कुछ मूल्यांकन क्यों शुरू करें और करें? – potapuff

उत्तर

7

यदि आपके मामले में कोई GROUP BY एक समग्र हमेशा एक पंक्ति रिटर्न है, COUNT(*) रिटर्न 0

यह कॉलम अपनी सूची का चयन में नहीं है, लेकिन हार्ड-कोडेड शाब्दिक 1

select count(*) where 1!=1 ; 
select 'bla' where 1!=1 having count(*)=0; 

देखने के लिए कि एक मेज 0 पंक्तियां हैं या नहीं पता लगाने के लिए fiddle

+0

का समर्थन नहीं करता है ठीक है, यदि ग्रुप के बिना हैविंग हमेशा एक पंक्ति देता है तो इस पंक्ति में कौन से डेटा हैं? – potapuff

+0

@potapuff: यदि कोई मिलान पंक्ति नहीं है 'COUNT' शून्य लौटाता है,' SUM', 'MIN', आदि। – dnoeth

3

HAVINGGROUP BY बिना cluase वैध है और पूरे मेज पर चल रही है। एसक्यूएल स्टैंडर्ड से 92:

7,10

:: = होने

सिंटेक्स नियम

1) कोर्ट बनें। टीई को तुरंत उस एचसी में शामिल होने दें।

यदि TE तुरंत नहीं होता है, तो ग्रुप बाय() अंतर्निहित है।

और:

:: = ग्रुप द्वारा

<grouping specification> ::= 
<grouping column reference> 
    | <rollup list> 
    | <cube list> 
    | <grouping sets list> 
    | <grand total> 
    | <concatenated grouping> 

<grouping set> ::= 
<ordinary grouping set> 
    | <rollup list> 
    | <cube list> 
    | <grand total> 

<grand total> ::= <left paren> <right paren> 

आप GROUP BY() देख के रूप में grand total व्यवहार किया जाता है।

अपने उदाहरण में आपके पास:

select 1 
where 1!=1 
having count(*)=0; 

वास्तव में की तरह कुछ है:

select 1 
where 1!=1 
-- group by() 
having count(*)=0; 
+0

वैसे, अधिकांश डेटाबेस (MySQL, PostgreSQL, Oracle) ग्रुप BY() :) – potapuff

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