sql >> Databasteknik >  >> RDS >> Sqlserver

Hur skapar man en SQL Server-funktion för att sammanfoga flera rader från en underfråga till ett enda avgränsat fält?

Om du använder SQL Server 2005 kan du använda kommandot FOR XML PATH.

SELECT [VehicleID]
     , [Name]
     , (STUFF((SELECT CAST(', ' + [City] AS VARCHAR(MAX)) 
         FROM [Location] 
         WHERE (VehicleID = Vehicle.VehicleID) 
         FOR XML PATH ('')), 1, 2, '')) AS Locations
FROM [Vehicle]

Det är mycket enklare än att använda en markör och verkar fungera ganska bra.

Uppdatera

För alla som fortfarande använder den här metoden med nyare versioner av SQL Server, finns det ett annat sätt att göra det på som är lite enklare och mer prestanda med STRING_AGG metod som har varit tillgänglig sedan SQL Server 2017.

SELECT  [VehicleID]
       ,[Name]
       ,(SELECT STRING_AGG([City], ', ')
         FROM [Location]
         WHERE VehicleID = V.VehicleID) AS Locations
FROM   [Vehicle] V

Detta gör att en annan separator kan specificeras som den andra parametern, vilket ger lite mer flexibilitet jämfört med den tidigare metoden.



  1. Hur man skapar en sammansatt primär nyckel i SQL Server (T-SQL-exempel)

  2. Hur man stänger sqlalchemy-anslutning i MySQL

  3. Returnerar resultat även för element i IN-listan som inte finns i tabellen

  4. Hur NVL() fungerar i MariaDB