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 jede FahrzeugID 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!