2016-07-26 67 views
5

İki değer içeren basit bir sütun tablom var. Onu seçer ve farklı modifiye edici ile değerleri birleştiririm ancak en son değeri alır. DISTINCT ile yanlış anlaşıldım mı?Sütun değerlerini ayrı ayrı birleştirmek tuhaf bir sonuç alır

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? 

cevap

4

yürütme planında hızlı bir bakış (ve etrafında oynayan bazı) ayrıca sıralar SELECT DISTINCT bana göstermişti ve bunun maksimum kimliği olsun.

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

Örneğin

, (4 en yüksek biri olduğu için) ben sonucu 4 tanınacak.

Çözüm? Böyle bir alt sorguda "ayrı" yerleştirin: 1, 2, 3, 4,

+1

Bu aslında ilginç:

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

ile sonuçlanan. Hiç bakmadım ama bu “GROUP BY” ile “DISTINCT” arasında bir fark gibi görünüyor. Yürütme planı, değişken değerini hesapladığı sırayı değiştirir ... – ZLK

+0

Teşekkür ederim, Operatörü birleştir + topla işlevi olarak hareket etmeyi biliyorum, ancak neden Max()? – Mohammadreza

+0

Yeniden yazmanız hala yürütme planı bağımlı ve garanti edilmeyen davranışlara dayanır. Tek güvenli yol, xml yolu gibi başka bir yöntemi kullanmaktır. –