23

Ich habe derzeit eine SQL-Abfrage, die eine Anzahl von Feldern zurückgibt. Ich brauche eines der Felder, um effektiv ein Sub-Abfrage-Sub zu sein.SQL, Wie verkette ich Ergebnisse?

Das Problem im Detail:

Wenn ich eine Tabelle X mit zwei Spalten, ModuleID und sagt ModuleValue, wie kann ich eine SQL-Abfrage schreiben, um die Ergebnisse zu nehmen und es in ein Feld verketten:

EG Treffer von

(SELECT ModuleValue FROM Table_X WHERE [email protected]) 

Wert 1

Wert 2

Wert 3

...

Ich muß somit das Ergebnis zurück (als eine einzelne Reihe im Gegensatz zu dem oben):

Wert 1, Wert 2, Wert 3

Gibt es einen einfache Verkettungsmethode, die Benutzer sein könnte?

EDIT:

DB ist MS TSQL (2005)

+0

Sie nur die Daten wollen Sind abzurufen oder ein anderes Feld aktualisieren mit es? – Evernoob

+0

Nur Abrufen, auch seine MS TSQL – Darknight

Antwort

26

Mit MSSQL Sie etwas tun können:

declare @result varchar(500) 
set @result = '' 
select @result = @result + ModuleValue + ', ' 
from TableX where ModuleId = @ModuleId 
+0

Vielen Dank! Ich werde es jetzt versuchen, wird dich als beantwortet markieren, wenn es funktioniert. – Darknight

+0

Das ist, was ich suchte, funktionierte gut, vielen Dank! – Darknight

+1

SELECT LEFT (@ Ergebnis, LEN (@Ergebnis) -1) AS Txt – suiwenfeng

10

In mysql Sie die verwenden würde, folgende Funktion:

SELECT GROUP_CONCAT(ModuleValue, ",") FROM Table_X WHERE [email protected] 

Ich bin mir nicht sicher, welchen Dialekt Sie verwenden.

+0

Verwandte, da es für mich nützlich war: http://StackOverflow.com/Questions/2567000/Mysql-and-Group-Concat-MaximumLength – starryknight64

3

Es hängt von der Datenbank ab, die Sie verwenden. MySQL unterstützt zum Beispiel die (nicht standardmäßige) group_concat Funktion. So könnten Sie schreiben:

SELECT GROUP_CONCAT(ModuleValue) FROM Table_X WHERE [email protected] 

Gruppenkonzept ist jedoch nicht auf allen Datenbankservern verfügbar.

6

In SQL Server 2005 und höher, können Sie etwas tun:

SELECT 
    (SELECT ModuleValue + ',' 
    FROM dbo.Modules 
    FOR XML PATH('') 
    ) 
FROM dbo.Modules 
WHERE ModuleID = 1 

Diese sollten Sie wie etwas geben, was Sie suchen.

Marc

+0

scheint interessant, habe nicht viel XML-Pfad verwendet. Ich werde sicher mit diesem spielen. Vielen Dank! – Darknight

31

Dieses schließt automatisch das folgende Komma, im Gegensatz zu den meisten anderen Antworten.

DECLARE @csv VARCHAR(1000) 

SELECT @csv = COALESCE(@csv + ',', '') + ModuleValue 
FROM Table_X 
WHERE ModuleID = @ModuleID 

(Wenn die ModuleValue Spalte nicht bereits ein String-Typ ist, dann könnte man es auf eine VARCHAR werfen müssen.)

+0

Gut gemerkt, in diesem Fall war es ein varchar, aber in anderen Fällen ist dieses coule gut andere Werttypen. – Darknight

0

Kleines Update auf Marc werden wir zusätzliche haben „“ bei der Ende. Ich benutzte Stuff-Funktion, um zusätzliches Semikolon zu entfernen.

 SELECT STUFF(( SELECT ',' + ModuleValue AS ModuleValue 
          FROM ModuleValue WHERE [email protected] 
         FOR XML PATH('') 
        ), 1, 1, '')