Leider verfügt SQL Server nicht über eine einzige Funktion zum Durchführen einer Gruppenverkettung. Es gibt jedoch verschiedene Möglichkeiten, das Ergebnis zu erhalten.
Sie können implementieren FOR XML PATHund STUFF():
SELECT DISTINCT d.AppId,
d.AppName,
d.AppType,
Tags = STUFF((SELECT ', ' + t.TagName
FROM AppTags t
where d.AppID = t.AppID
FOR XML PATH (''))
, 1, 1, '')
FROM AppDetails d
WHERE d.AppID = '1';
Siehe SQL Fiddle mit Demo .
Oder Sie könnten verwenden FOR XML PATHmit CROSS APPLY:
SELECT DISTINCT d.AppId,
d.AppName,
d.AppType,
tags = left(t.tags, len(t.tags)-1)
FROM AppDetails d
CROSS APPLY
(
SELECT t.TagName + ', '
FROM AppTags t
WHERE d.AppID = t.AppID
FOR XML PATH('')
) t (Tags)
WHERE d.AppID = '1';
Siehe SQL Fiddle mit Demo .
Wenn Sie dann die tagsWerte abfragen möchten, können Sie einen CTE verwenden, der ähnlich ist wie:
;with cte as
(
SELECT DISTINCT d.AppId,
d.AppName,
d.AppType,
Tags = STUFF((SELECT ', ' + t.TagName
FROM AppTags t
where d.AppID = t.AppID
FOR XML PATH (''))
, 1, 1, '')
FROM AppDetails d
WHERE d.AppID = '1'
)
select *
from cte
where tags like '%test1%'
Siehe Demo
Wenn TagNameenthält bestimmte XML - Zeichen (zB >, &) werden sie in Entitäten geworden ( >-> >, &-> &). Um dies zu vermeiden, wechseln Sie FOR XML PATH('')zu FOR XML PATH, TYPE).value(N'.[1]',N'nvarchar(max)').