JOA*_*MON 7 sql-server-2008 join syntax group-concatenation
假设我有以下查询:
SELECT *
FROM AppDetails, AppTags
WHERE AppDetails.AppID = '1'
AND AppDetails.AppID = AppTags.AppID
Run Code Online (Sandbox Code Playgroud)
这给出了以下结果:
AppID AppName AppType Tag
1 Application1 Utility Test1
1 Application1 Utility Test2
1 Application1 Utility Test3
Run Code Online (Sandbox Code Playgroud)
如何修改查询以返回如下内容:
AppID AppName AppType Tags
1 Application1 Utility Test1,Test2,Test3
Run Code Online (Sandbox Code Playgroud)
Tar*_*ryn 10
不幸的是,SQL Server 没有一个函数来执行组连接,但有几种不同的方法可以获得结果。
您可以实施FOR XML PATH
和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';
Run Code Online (Sandbox Code Playgroud)
或者你可以用FOR XML PATH
与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';
Run Code Online (Sandbox Code Playgroud)
如果您想对这些tags
值进行查询,则可以使用类似于以下内容的 CTE:
;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%'
Run Code Online (Sandbox Code Playgroud)
看演示
如果TagName
包含某些 XML 字符(例如>
, &
),它们将被实体化(>
-> >
, &
-> &
)。为避免这种情况,请更改FOR XML PATH('')
为FOR XML PATH, TYPE).value(N'.[1]',N'nvarchar(max)')
。
归档时间: |
|
查看次数: |
13437 次 |
最近记录: |