Wie man mehrere Zeilen in SQL Server effizient in ein einzelnes, durch Trennzeichen getrenntes Feld join
In der Datenbankverwaltung, insbesondere beim Umgang mit relationalen Datenbanken wie SQL Server, trifft man häufig auf Szenarien, in denen man mehrere Zeilen in ein einzelnes Feld kombinieren muss, um die Lesbarkeit zu verbessern und die Verarbeitung zu vereinfachen. Dieser Blogbeitrag behandelt, wie man dieses Problem mit SQL Server-Funktionen lösen kann und veranschaulicht das gewünschte Ergebnis sowie effektive Lösungen für verschiedene SQL Server-Versionen.
Das Problem
Stellen Sie sich vor, Sie haben zwei Tabellen: Vehicles
und Locations
. Hier ist ein kurzes Beispiel, wie diese Tabellen aussehen:
Fahrzeuge Tabelle
FahrzeugID | Name |
---|---|
1 | Chuck |
2 | Larry |
Standorte Tabelle
StandortID | FahrzeugID | Stadt |
---|---|---|
1 | 1 | New York |
2 | 1 | Seattle |
3 | 1 | Vancouver |
4 | 2 | Los Angeles |
5 | 2 | Houston |
Das Ziel ist es, Daten in einer Weise zu ziehen, die den Namen jedes Fahrzeugs zusammen mit einer Liste seiner zugehörigen Standorte anzeigt. Das gewünschte Ergebnis sollte etwa so aussehen:
FahrzeugID | Name | Standorte |
---|---|---|
1 | Chuck | New York, Seattle, Vancouver |
2 | Larry | Los Angeles, Houston |
Während Sie dies durch komplexe Abfragen und Programmierungen erreichen könnten, benötigen wir eine Lösung, die den Prozess vereinfacht.
Lösung: Verwendung von SQL Server-Funktionen
Methode 1: Verwendung von FOR XML PATH
Wenn Sie SQL Server 2005 oder neuer verwenden, gehört einer der effektivsten Ansatz zur Erreichung dieser Verkettung zum FOR XML PATH
Befehl. So können Sie es implementieren:
SELECT [FahrzeugID],
[Name],
(STUFF((SELECT ', ' + [Stadt] AS [text()]
FROM [Standorte]
WHERE (FahrzeugID = Fahrzeug.FahrzeugID)
FOR XML PATH('')), 1, 2, '')) AS Standorte
FROM [Fahrzeuge]
Erklärung:
- Die innere
SELECT
-Anweisung ruft die Standorte für jedeFahrzeugID
ab und verkettet sie zu einer einzigen Zeichenfolge. FOR XML PATH('')
ermöglicht es uns, eine einzige XML-Zeichenfolge aus den mehreren Zeilen, die von der Unterabfrage zurückgegeben werden, zu generieren.STUFF
wird verwendet, um das führende Komma und das Leerzeichen aus der verketteten Zeichenfolge zu entfernen.
Methode 2: Verwendung von STRING_AGG (SQL Server 2017 und Neuer)
Für diejenigen, die SQL Server 2017 oder neuer verwenden, gibt es einen noch einfacheren Weg, dies mit der STRING_AGG
-Funktion zu erreichen. So sieht es aus:
SELECT [FahrzeugID],
[Name],
(SELECT STRING_AGG([Stadt], ', ')
FROM [Standorte]
WHERE FahrzeugID = V.FahrzeugID) AS Standorte
FROM [Fahrzeuge] V
Erklärung:
STRING_AGG
nimmt zwei Argumente: die Spalte, die Sie aggregieren möchten, und das Trennzeichen, mit dem Sie die Einträge trennen möchten. Es ist viel klarer und effizienter als die vorherige Methode.
Fazit
Das Kombinieren mehrerer Zeilen in ein einzelnes, durch Trennzeichen getrenntes Feld in SQL Server kann die Lesbarkeit und Zugänglichkeit Ihrer Daten erheblich verbessern. Egal, ob Sie in einer älteren Version sind und FOR XML PATH verwenden oder die STRING_AGG-Funktion in neueren Versionen nutzen können, SQL Server bietet Ihnen die Werkzeuge, die Sie benötigen, um Ihre Daten effizient zu verwalten.
Durch das Verständnis dieser Techniken können Sie Ihre SQL-Abfragen vereinfachen, wodurch sie leichter zu lesen, zu warten und zukünftig zu ändern sind. Wählen Sie immer die Methode, die am besten zu Ihrer SQL Server-Version und Ihren spezifischen Anforderungen passt.
Wenn Sie Fragen haben oder weitere Erläuterungen zu diesen Methoden benötigen, zögern Sie nicht, sie in den Kommentaren unten zu stellen!