Выберите обратно список с разделителями-запятыми, сгруппированный по идентификатору

у нас есть следующие таблицы:

EntryTag
---------
EntryID
TagID

Пример ввода (EntryID, TagID):

1 2
1 4
1 5
2 3
2 4
2 5
etc...

а также

Tags
----
TagID
Name

пример вывода:

1 peas
2 corn
3 carrots
...etc.

Я хочу вернуть список тегов для каждой записи, но в виде одной строки, где теги разделены запятыми.

Например, я хочу увидеть это:

EntryID     TagsCommaDelimited
-------     ------------------
1           corn, peas, carrots
2           barley, oats
...and so on 

Поэтому мне нужно перечислить каждый EntryID и этоСоответствующий список тегов, разделенных запятой.

И я'm выберите форму таблицы содержимого, которая выглядит следующим образом:

Content
--------
ID   -(which is in essence the EntryID, they didn't make it consistent)
Description
..etc.

Вот'что яЯ пробовал, но мне не повезло с моим синтаксисом:

declare @tagsCommaDelimited varchar (200) 
set @tagsCommaDelimited = '';


With AllEntryTags_CTE(Name, EntryID )
as
(
    select Tags .Name,
           entryTags.EntryID 
    from  EntryTag entryTags
    join Tags on tags.Id = entryTags.TagID
    group by entryTags.EntryID, tags.Name, entryTags.TagID 
),

TagsByEntryCommaDelimited_CTE( EntryID, CommaDelimitedTags)
as
(
    select  distinct allTags.EntryID,
            (select @tagsCommaDelimited from ( select @tagsCommaDelimited = coalesce (case when @tagsCommaDelimited = '' then allTags.Name
                                                                                      else @tagsCommaDelimited + ',' + allTags.Name end ,'') as CommaDelimitedTags
    from  AllEntryTags_CTE allTags  
)

select EntryID, CommaDelimitedTags from TagsByEntryCommaDelimited_CTE

---------------------------ОБНОВИТЬ---------------------- ------------

пока я пошел с gotgn для тестирования

Проблема у меня сейчас в том, что яя пытаюсь использовать этот последний CTE в моем последнем операторе select, чтобы получить список имен тегов, разделенных запятыми ... но это 'говорит, что мой синтаксис неверен:

;WITH CommaDelimitedTagIDs AS
(
    SELECT DISTINCT EntryID,
    (SELECT SUBSTRING((SELECT ',' + CAST(TagID AS NVARCHAR(10)) 
                       FROM EntryTag AS T1 WHERE T1.EntryID=T2.EntryID 
                       ORDER BY TagID 
                       FOR XML PATH('')),2,200)) AS commaDelimitedTagIDs
    FROM EntryTag T2 
),

CommaDelimittedTagNames_CTE (EntryID, CommaDelimitedTagNames) as
( 
    SELECT EntryID, (SELECT SUBSTRING((SELECT ',' + Name 
                     FROM Tags 
                     WHERE commaDelimitedTagIDs LIKE '%'+CAST(ID AS NVARCHAR(5))+'%'  
                     ORDER BY ID FOR XML PATH('')),2,200) AS CSV) 
    FROM CommaDelimitedTagIDs
)

--select EntryID, CommaDelimitedTagNames from CommaDelimittedTagNames_CTE


SELECT  Title,
        [Description],
        DateSyndicated,
        DateUpdated,
        1, 
        CAST([Text] AS NVARCHAR(MAX)),
        Author,
        (select CommaDelimitedTagNames from CommaDelimittedTagNames_CTE) as tagNamesCommaDelimited 
 FROM Content
 Join CommaDelimittedTagNames_CTE tags on tags.EntryID = Content.ID
 group by ID, Title, [Description], 
          DateSyndicated, DateUpdated, 
          CAST(subtextContent.[Text] AS NVARCHAR(MAX)), Author 

пробовал так же, не повезло

  Select
    ....other fields
    (select CommaDelimitedTagNames from CommaDelimittedTagNames_CTE tagNames 
     join subContent on subContent.ID = tagNames.EntryID) as tags 
  FROM Content as subContent

хорошо, я думаю, вы можетеЯ должен был поменять его на Куда. Не знаю почему, но теперь это работает:

   Select
    ....other fields
    (select CommaDelimitedTagNames from CommaDelimittedTagNames_CTE tagNames 
     where Content.ID = tagNames.EntryID) as tags 
  FROM Content 

Ответы на вопрос(2)

Ваш ответ на вопрос