Heim > Datenbank > MySQL-Tutorial > Wie kann ich Zeilen aus einer Unterabfrage in SQL Server effizient verketten?

Wie kann ich Zeilen aus einer Unterabfrage in SQL Server effizient verketten?

Linda Hamilton
Freigeben: 2025-01-22 00:15:10
Original
842 Leute haben es durchsucht

How Can I Efficiently Concatenate Rows from a Subquery in SQL Server?

SQL Server-Zeilenverkettung: Eine benutzerdefinierte Funktion und ein moderner Ansatz

Dieser Artikel demonstriert zwei Methoden zum effizienten Verketten von Zeilen aus einer Unterabfrage in SQL Server, was zu einer einzigen durch Trennzeichen getrennten Zeichenfolge führt. Die erste verwendet eine benutzerdefinierte Funktion und bietet Kompatibilität zwischen verschiedenen SQL Server-Versionen. Die zweite nutzt die Funktion STRING_AGG, die in SQL Server 2017 und höher verfügbar ist und eine verbesserte Leistung bietet.

Methode 1: Die JoinRowsbenutzerdefinierte Funktion

Für eine breitere Kompatibilität mit SQL Server-Versionen bietet eine benutzerdefinierte Funktion eine saubere Lösung. Die folgende JoinRows-Funktion verwendet ein Trennzeichen und eine Tabelle als Eingabe und gibt eine verkettete Zeichenfolge zurück:

CREATE FUNCTION JoinRows (
    @Separator CHAR(1),
    @InputTable TABLE (ID INT, Value VARCHAR(MAX))
)
RETURNS VARCHAR(MAX)
BEGIN
    RETURN (
        SELECT COALESCE(@Separator + I.Value, I.Value)
        FROM @InputTable AS I
        FOR XML PATH('')
    );
END;
Nach dem Login kopieren

Diese Funktion kann wie folgt in Ihre Abfrage integriert werden:

SELECT
    VehicleID,
    Name,
    JoinRows(', ', (SELECT City FROM Location WHERE VehicleID = Vehicles.VehicleID)) AS Locations
FROM Vehicles;
Nach dem Login kopieren

Methode 2: STRING_AGG (SQL Server 2017 und höher)

Für SQL Server 2017 und nachfolgende Versionen bietet die integrierte STRING_AGG-Funktion einen schlankeren und oft schnelleren Ansatz:

SELECT
    VehicleID,
    Name,
    STRING_AGG(City, ', ') WITHIN GROUP (ORDER BY City) AS Locations
FROM Vehicles
INNER JOIN Location ON Vehicles.VehicleID = Location.VehicleID
GROUP BY VehicleID, Name;
Nach dem Login kopieren

Diese Methode verbindet die Tabellen Vehicles und Location direkt und verwendet STRING_AGG, um die City-Werte zu aggregieren, partitioniert durch VehicleID, was eine effizientere Lösung für neuere SQL Server-Instanzen bietet. Beachten Sie den Zusatz WITHIN GROUP (ORDER BY City) für eine vorhersehbare Reihenfolge verketteter Städte. Dies ist optional, wird aber für konsistente Ergebnisse empfohlen. Die GROUP BY-Klausel ist auch notwendig, um eine korrekte Aggregation sicherzustellen.

Wählen Sie die Methode, die am besten zu Ihrer SQL Server-Version und Ihren Leistungsanforderungen passt. Für ältere Versionen ist die benutzerdefinierte Funktion erforderlich; für neuere Versionen bietet STRING_AGG einen erheblichen Leistungsvorteil.

Das obige ist der detaillierte Inhalt vonWie kann ich Zeilen aus einer Unterabfrage in SQL Server effizient verketten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage