2010-08-16 21 views
7

मैं एक प्रश्न है कि नाम और ग्राहकों के पते से संबंधित क्षेत्रों का एक समूह का चयन किया है, लेकिन यह करने पर निर्भर करता:"चयन डिस्टिंक ए, बी से ..." "चयन डिस्टिंट ए + 'से कम रिकॉर्ड लौटाता है। + बी से ... "?

SELECT DISTINCT a, b, c, ... FROM big_dumb_flat_table 

यह रिकॉर्ड की एक गुच्छा (10,986,590) देता है। जब मैं चयन सूची में अल्पविराम की जगह एक पाइप से अलग किए concatenated स्ट्रिंग के रूप में यह फ़ॉर्मेट करने के लिए:

SELECT DISTINCT a + '|' + b + '|' + c + '|' + ... FROM big_dumb_flat_table 

यह 248 अधिक रिकॉर्ड लौटा रहा है। मैंने खुद को आश्वस्त किया है कि किसी भी क्षेत्र में कोई पाइप नहीं है जो लौटे हुए सेट की निष्ठा को खराब कर सकती है। यहाँ क्या चल रहा है?

+0

क्या आप देख सकते हैं कि आप 'SELECT ए, बी, सी ... से ... ग्रुप द्वारा ए, बी, सी ...' और अपने प्रश्न में इसे संपादित करें? (जैसा कि 'DISTINCT' तकनीकी रूप से एक (बहुत सुविधाजनक) हैक है) – AakashM

+0

प्रश्नों में गिनती (*) भी जोड़ें और देखें कि – Mark

+2

क्या मैं ** कम ** रिकॉर्ड वापस करने के लिए कंसटेनेशन का उपयोग कर क्वेरी की अपेक्षा करता हूं, क्योंकि यदि इनमें से कोई भी मान 'शून्य' हैं आपको एक 'शून्य' परिणाम मिलेगा। – RedFilter

उत्तर

10

पिछली जगहों का कारण यह हो सकता है। स्ट्रिंग तुलना के लिए इन्हें अनदेखा कर दिया जाता है।

CREATE TABLE #T 
(
a varchar(10), 
b varchar(10), 
c varchar(10) 
) 

INSERT INTO #T 
SELECT 'a ' as a, 'b' as b, 'c ' as c union all 
SELECT 'a' as a, 'b' as b, 'c ' as c 

SELECT DISTINCT a, b, c 
FROM #T /*1 result*/ 

SELECT DISTINCT a + '|' + b + '|' + c + '|' 
FROM #T /*2 results*/ 


SELECT DISTINCT LTRIM(RTRIM(a)) + '|' + LTRIM(RTRIM(b)) + '|' + 
       LTRIM(RTRIM(c)) + '|' 
FROM #T /*1 result*/ 
+0

साफ। मैंने संक्षिप्त कोड चलाया जिसे आपने पहली बार पोस्ट किया था कि आप सही थे और अब मैं ltrim (rtrim()) में लिपटे सभी क्षेत्रों के साथ दो प्रश्नों का परीक्षण कर रहा हूं। इस समस्या को खत्म करना चाहिए, है ना? – clweeks

+0

और उसे नल को संभालना चाहिए। – HLGEM

+0

@clweeks - क्या ये कॉलम शून्य हैं? यदि ऐसा है तो आपको कोल्सिस या कुछ के साथ नल को संभालने के लिए याद रखना होगा। (एनबी: यदि यह सिर्फ एक कार्य है तो आप 'SET CONCAT_NULL_YIELDS_NULL OFF' कर सकते हैं लेकिन उत्पादन कोड के लिए कुछ नहीं!) –

2

वास्तव में किसी भी परिस्थितियों में आपको मुझे लगता है कि के बारे में सोच सकते हैं आप अधिक रिकॉर्ड, केवल कम मिलेगा नहीं हैं। मैं केवल '+' चुनकर क्वेरी को सरल बना दूंगा, फिर जब आप जाते हैं तो अधिक कॉलम जोड़ें।

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