2016-07-26 6 views
5

मेरे पास दो मानों के साथ एक साधारण कॉलम तालिका है। मैं इसे चुनता हूं और अलग संशोधक के साथ मूल्यों को जोड़ता हूं लेकिन यह केवल नवीनतम मूल्य प्राप्त करता है। क्या मैं DISTINCT के साथ गलत धारणा में हूं?अलग-अलग कॉलम मानों को अलग करने के साथ अजीब परिणाम

DECLARE @table TABLE(Id int) 
DECLARE @result VARCHAR(MAX) = '' 

INSERT @table VALUES(1), (2) 

SELECT 
    @result = @result + CAST(Id AS VARCHAR(10)) + ',' 
FROM 
    @table 

SELECT @result --— output: 1,2, 

-------same With distinct 
SET @result = '' 

SELECT DISTINCT @result = @result 
     + CAST(Id AS VARCHAR(10)) + ',' 
FROM @table 
SELECT @result --— expected output: 1,2, actual output: 2, why? 

उत्तर

4

निष्पादन योजना में एक त्वरित नज़र (और चारों ओर खेल रहे कुछ) मेरे दिखाया था कि DISTINCT का चयन भी सॉर्ट करता, और वजह आप अधिकतम आईडी मिलता है।

उदाहरण के लिए

,

INSERT @table VALUES(1),(2),(1),(4), (2), (3) 

में मैं परिणाम 4 मिलेगा (क्योंकि 4 उच्चतम एक है)।

समाधान? इस तरह एक उप क्वेरी में रखें "अलग": 1, 2, 3, 4,

+1

यह वास्तव में दिलचस्प है:

SELECT @result = @result + CAST(Id AS VARCHAR(10)) + ',' FROM (SELECT DISTINCT id FROM @table) Q 

में परिणामस्वरूप। मैंने इसे कभी नहीं देखा है, लेकिन यह 'ग्रुप बाय' बनाम 'DISTINCT' में एक अंतर प्रतीत होता है। निष्पादन योजना उस क्रम को बदलती है जिसमें यह चर वैल्यू की गणना करता है ... – ZLK

+0

धन्यवाद, मैं समेकित ऑपरेटर + को कुल कार्य के रूप में कार्य करता हूं लेकिन मैक्स() के रूप में अलग-अलग कार्य के साथ ऑपरेटर को समेकित क्यों करता हूं? – Mohammadreza

+0

आपकी पुनर्लेख अभी भी ऐसे व्यवहार पर निर्भर करती है जो निष्पादन योजना निर्भर है और इसकी गारंटी नहीं है। एकमात्र सुरक्षित तरीका कुछ अन्य विधि जैसे 'xml path' का उपयोग करना है। –

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