sql >> Database >  >> RDS >> Sqlserver

Hoe maak je een SQL Server-functie om meerdere rijen van een subquery samen te voegen in een enkel gescheiden veld?

Als u SQL Server 2005 gebruikt, kunt u de opdracht FOR XML PATH gebruiken.

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]

Het is een stuk eenvoudiger dan het gebruik van een cursor, en het lijkt redelijk goed te werken.

Bijwerken

Voor iedereen die deze methode nog steeds gebruikt met nieuwere versies van SQL Server, is er een andere manier om dit te doen die een beetje eenvoudiger en performanter is met behulp van deSTRING_AGG methode die beschikbaar is sinds SQL Server 2017.

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

Hierdoor kan ook een ander scheidingsteken worden opgegeven als de tweede parameter, wat een beetje meer flexibiliteit biedt ten opzichte van de vorige methode.



  1. Maak een lijst van alle sequenties in een Postgres db 8.1 met SQL

  2. Beste manier om tijd (uu:mm) in een database op te slaan

  3. Waarde van weergave-item invullen bij query in Oracle Forms

  4. Samenvoeging van SQL Server-tekenreeksen met Null