我有以下表格:選擇回來的ID分組用逗號分隔的列表
EntryTag
---------
EntryID
TagID
例putput(的EntryID,標籤識別):
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和它對應的逗號分隔的標籤列表。
而且我選擇形式的內容表看起來像這樣:
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
---- ----------------------- UPDATE -------------------------- --------
現在我跟gogn進行測試
我現在的問題是,我想用這最後CTE在我最後的select語句搶逗號標籤分隔的列表names..but它在說我的語法是不正確的:
;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
你能解釋一下你在用XML做什麼以及它是如何工作的。 – PositiveGuy
@CoffeeAddict我添加了對正在發生的事情的解釋。你爲什麼更喜歡CTE? gotqn使用CTE [在他的回答(http://stackoverflow.com/a/14374759/569436),但他仍然使用'爲xml'來串聯值。我想這可以通過遞歸CTE來完成,而不是使用'for xml',但我認爲這不會帶來什麼實際好處。 –
這個解決方案的一個優點是它變成了1個sql命令,這使得它更容易與jdbcTemplate或其他數據庫API一起使用。 –