2016-07-26 11 views
5

Ich habe eine einfache Spalte Tabelle mit zwei Werten. Ich wähle es aus und verknüpfe Werte mit unterschiedlichen Modifikatoren, aber es erhält nur den neuesten Wert. Habe ich ein Missverständnis mit DISTINCT?Verkettung von Spaltenwerten mit distinct bekommt seltsames Ergebnis

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? 

Antwort

4

Ein kurzer Blick in den Ausführungsplan (und einige herumgespielt) hatte mir gezeigt, dass SELECT DISTINCT auch sortiert werden, und dafür die maximale ID erhalten.

Zum Beispiel in den

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

würde ich das Ergebnis 4 erhalten (weil 4 ist die höchste).

Die Lösung? Legen Sie die "distinct" in einer Sub-Abfrage wie folgt aus:

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

Resultat: 1, 2, 3, 4,

+1

Dies ist eigentlich interessant. Ich habe mich nie damit befasst, aber das scheint ein Unterschied in "GROUP BY" gegenüber "DISTINCT" zu sein. Der Ausführungsplan ändert die Reihenfolge, in der er den Variablenwert berechnet ... – ZLK

+0

Vielen Dank, ich weiß, verketten Operator + agieren als Aggregatfunktion, aber warum verketten Operator mit Distinct als Max()? – Mohammadreza

+0

Ihr Umschreiben basiert immer noch auf einem Verhalten, das vom Ausführungsplan abhängig und nicht garantiert ist. Der einzige sichere Weg ist die Verwendung einer anderen Methode wie 'xml path'. –