¿Cómo debo modificar esta statement SQL?

Mi vista de SQL Server

SELECT geo.HyperLinks.CatID, geo.Tags.Tag, geo.HyperLinks.HyperLinksID FROM geo.HyperLinks LEFT OUTER JOIN geo.Tags INNER JOIN geo.TagsList ON geo.Tags.TagID = geo.TagsList.TagID ON geo.HyperLinks.HyperLinksID = geo.TagsList.HyperLinksID WHERE HyperLinksID = 1 

devuelve estos …

 HyperLinksID CatID Tags 1 2 Sport 1 2 Tennis 1 2 Golf 

¿Cómo debo modificar lo anterior para tener resultados como

 HyperLinksID CatID TagsInOneRowSeperatedWithSpaceCharacter 1 2 Sport Tennis Golf 

ACTUALIZACIÓN: Como Brad sugirió que vine aquí …

 DECLARE @TagList varchar(100) SELECT @TagList = COALESCE(@TagList + ', ', '') + CAST(TagID AS nvarchar(100)) FROM TagsList WHERE HyperLinksID = 1 SELECT @TagList 

Ahora el resultado parece

 HyperLinksID CatID TagsInOneRowSeperatedWithSpaceCharacter 1 2 ID_OF_Sport ID_OF_Tennis ID_OF_Golf 

Y, por supuesto, tengo que combinar los contenidos de la variable @TagList y la statement SELECT original

Lo que significa que tendré que esperar la recompensa sagrada de SO 🙁

Si es SQL, testing esta publicación:

Valores de fila concatenados

Si quiere probar su mano en el código CLR, hay ejemplos de cómo crear una function agregada personalizada para la concatenación, nuevamente para MS SQL.

Esta publicación es bastante exhaustiva con muchas forms de lograr tu objective.

Utilizando el método desde aquí para evitar cualquier problema si sus nombres de label contienen caracteres XML especiales :.

 ;With HyperLinks As ( SELECT 1 AS HyperLinksID, 2 AS CatID ), TagsList AS ( SELECT 1 AS TagId, 1 AS HyperLinksID UNION ALL SELECT 2 AS TagId, 1 AS HyperLinksID UNION ALL SELECT 3 AS TagId, 1 AS HyperLinksID ) , Tags AS ( SELECT 1 AS TagId, 'Sport' as Tag UNION ALL SELECT 2 AS TagId, 'Tennis' as Tag UNION ALL SELECT 3 AS TagId, 'Golf' as Tag ) SELECT HyperLinksID, CatID , (SELECT mydata FROM ( SELECT Tag AS [data()] FROM Tags t JOIN TagsList tl ON t.TagId = tl.TagId WHERE tl.HyperLinksID = h.HyperLinksID ORDER BY t.TagId FOR XML PATH(''), TYPE ) AS d ( mydata ) FOR XML RAW, TYPE ) .value( '/row[1]/mydata[1]', 'varchar(max)' ) TagsInOneRowSeperatedWithSpaceCharacter FROM HyperLinks h 

Editar: Como KM señala en los comentarios, este método agrega automáticamente espacios, así que eliminé los espacios agregados manualmente. Para delimitadores que no sean espacios como comas, la respuesta de Pedro parece más apropiada.

Si sabe que sus datos no contendrán ningún carácter problemático, entonces una versión más simple (probablemente más eficiente) es

 SELECT CatID , HyperLinksID, stuff( ( SELECT ' ' + Tag FROM Tags t JOIN TagsList tl ON t.TagId = tl.TagId WHERE tl.HyperLinksID = h.HyperLinksID ORDER BY t.TagId FOR XML PATH('') ), 1, 1, '') TagsInOneRowSeperatedWithSpaceCharacter FROM HyperLinks h 

Use FOR XML en una subconsulta correlacionada. Para una list delimitada por espacios:

 SELECT h.HyperLinksID, h.CatID , TagList = ( SELECT t.Tag AS [data()] FROM geo.TagList l JOIN geo.Tags t ON l.TagId = t.TagId WHERE l.HyperLinksID = h.HyperLinksID ORDER BY t.Tag FOR XML PATH(''), TYPE ).value('.','NVARCHAR(MAX)') FROM geo.HyperLinks AS h WHERE h.HyperLinksID = 1 

Para cualquier otro delimitador:

 SELECT h.HyperLinksID, h.CatID , TagList = STUFF(( SELECT ', '+t.Tag FROM geo.TagList l JOIN geo.Tags t ON l.TagId = t.TagId WHERE l.HyperLinksID = h.HyperLinksID ORDER BY t.Tag FOR XML PATH(''), TYPE ).value('.','NVARCHAR(MAX)') ,1,2,'') FROM geo.HyperLinks AS h WHERE h.HyperLinksID = 1 

La subconsulta crea una list delimitada, y luego STUFF(...,1,2,'') elimina el encabezado,. TYPE).value() mayoría de los problemas comunes w / caracteres especiales en XML.