Выберите обратно список с разделителями-запятыми, сгруппированный по идентификатору
у нас есть следующие таблицы:
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