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 PATH
und 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 PATH
mit 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 tags
Werte 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 TagName
enthä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)')
.