2011-09-25 17 views
8

तुलनाक्यों इस क्वेरी nulls

SELECT distinct u_id,timestamp as time 
FROM my_table; 

और के साथ एक पंक्ति लौट करता

SELECT distinct u_id,max(timestamp) as time 
FROM my_table; 

मेरी मेज सब पर कोई पंक्तियों होते हैं (या अगर मैं जोड़ने के एक जहां खंड है कि यदि कोई भी पंक्ति से मेल खाता है):

पूर्व एक खाली परिणाम सेट (जो मुझे उम्मीद है) लौटाता है जबकि बाद में एक एकल पंक्ति लौटाती है जो दोनों क्षेत्रों के लिए मूल्य के रूप में शून्य है।

क्या कोई मुझे बता सकता है कि दूसरा ऐसा क्यों करता है जैसा करता है?

उत्तर

16

MySQL प्रलेखन कहते हैं

मैक्स() NULL भेजता है अगर कोई मिलान पंक्तियाँ नहीं थीं।

और यदि आपके पास कोई डेटा नहीं है तो यह केवल दोनों मानों को न्यूल के रूप में देता है।

आप दूसरी क्वेरी बहुत खाली resultset लौट, तो आप खंड है कि आप समग्र कार्यों के साथ उपयोग कर सकते हैं होने के साथ उदाहरण के लिए शून्य मान को फ़िल्टर करना चाहिए चाहते हैं:

SELECT DISTINCT u_id, MAX(timestamp) as time FROM my_table GROUP BY u_id HAVING time IS NOT NULL; 
+2

यह तकनीकी रूप से केवल आधा जवाब है - दूसरा आधा समूह की अनुपस्थिति है- दूसरे में खंड द्वारा गैर-योगों के साथ मिश्रित कुल कार्यों का उपयोग करते हुए, यही कारण है कि u_id 'NULL' है – tobyodavies

0

इस सवाल का जवाब यह वास्तविक व्याख्या करने के लिए काफी जटिल है, मेरे लिए किसी भी तरह :) शीर्षक बिंदु: एसक्यूएल संबंधपरक मॉडल में पाए गए कुल ऑपरेटरों का समर्थन नहीं करता है, बल्कि संक्षेप में एक विशेष मामले का समर्थन करता है। इसके अलावा, क्योंकि एसक्यूएल में एक डेटा संरचना है - तालिका - एसक्यूएल कुल ऑपरेटर इनवोकेशन (ढीले बोलने वाले) को कुछ टेबल अभिव्यक्ति के हिस्से के रूप में दिखाई देना चाहिए, इसलिए आपकी दूसरी तालिका एक 'डमी' एकल पंक्ति क्यों देती है।

एक पूर्ण/बेहतर स्पष्टीकरण के लिए, SQL and Relational Theory: How to Accurate SQL Code - C. J. Date (2009), अनुभाग 7.5 देखें। कुल ऑपरेटरों।

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