Using the approach from here to avoid any problems if your tag names contain special XML characters :.
;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
Edit: As KM points out in the comments, this method actually automatically adds spaces, so I removed manually added spaces. For delimiters other than spaces, such as commas, Peter's answer seems more appropriate.
If you know that your data will not contain any problematic characters, then a simpler (possibly more efficient) version
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
source share