Heim >Datenbank >MySQL-Tutorial >Wie kann ich in SQL Server mehrere Unterabfragezeilen in einem einzigen durch Trennzeichen getrennten Feld kombinieren?
SQL Server: Kombinieren mehrerer Unterabfragezeilen in einem einzigen durch Trennzeichen getrennten Feld
In diesem Artikel werden verschiedene Methoden zum Verketten von Zeilen aus einer Unterabfrage in einem einzelnen durch Trennzeichen getrennten Feld in SQL Server untersucht. Wir untersuchen Techniken, die für verschiedene SQL Server-Versionen geeignet sind.
Methode 1: FOR XML PATH (SQL Server 2005 und höher)
Dieser klassische Ansatz verwendet FOR XML PATH
, um Ergebnisse effizient zu verketten:
<code class="language-sql">SELECT [VehicleID], [Name], STUFF((SELECT ', ' + [City] FROM [Location] WHERE (VehicleID = Vehicle.VehicleID) FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS Locations FROM [Vehicle]</code>
Methode 2: STRING_AGG (SQL Server 2017 und höher)
Für neuere SQL Server-Versionen bietet STRING_AGG
eine besser lesbare und oft schnellere Lösung:
<code class="language-sql">SELECT [VehicleID], [Name], STRING_AGG([City], ', ') AS Locations FROM [Vehicle] V JOIN [Location] L ON V.VehicleID = L.VehicleID GROUP BY [VehicleID], [Name]</code>
Beachten Sie die Verwendung eines JOIN
hier für eine verbesserte Leistung im Vergleich zu einer Unterabfrage in diesem speziellen Fall.
Methode 3: Benutzerdefinierte Funktion (alle SQL Server-Versionen)
Für maximale Wiederverwendbarkeit über verschiedene SQL Server-Versionen und -Szenarien hinweg bietet eine benutzerdefinierte Funktion Flexibilität:
<code class="language-sql">CREATE FUNCTION dbo.JoinRows (@Subquery NVARCHAR(MAX), @Delimiter NVARCHAR(1)) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @Result NVARCHAR(MAX) = ''; DECLARE @Row NVARCHAR(MAX); DECLARE @NextRow CURSOR; SET @NextRow = CURSOR FOR SELECT [Value] FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;', @Subquery); OPEN @NextRow; FETCH NEXT FROM @NextRow INTO @Row; WHILE @@FETCH_STATUS = 0 BEGIN SET @Result += @Row + @Delimiter; FETCH NEXT FROM @NextRow INTO @Row; END; CLOSE @NextRow; DEALLOCATE @NextRow; RETURN STUFF(@Result, LEN(@Result), LEN(@Delimiter), ''); -- Remove trailing delimiter END; GO</code>
Diese Funktion verwendet OPENROWSET
, um die dynamische Unterabfrage auszuführen. Dies ist sicherer als die direkte Ausführung von dynamischem SQL. Die Funktion kann dann wie folgt verwendet werden:
<code class="language-sql">SELECT VehicleID, Name, dbo.JoinRows((SELECT City FROM Location WHERE VehicleID = Vehicle.VehicleID), ',') AS Locations FROM Vehicle;</code>
Wählen Sie die Methode, die am besten zu Ihrer SQL Server-Version und Ihren Leistungsanforderungen passt. Für SQL Server 2017 und höher wird STRING_AGG
aufgrund seiner Einfachheit und Leistung im Allgemeinen empfohlen. Für ältere Versionen oder komplexere Szenarien bietet die benutzerdefinierte Funktion eine robuste und wiederverwendbare Lösung.
Das obige ist der detaillierte Inhalt vonWie kann ich in SQL Server mehrere Unterabfragezeilen in einem einzigen durch Trennzeichen getrennten Feld kombinieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!