Thật không may, SQL Server không có một chức năng duy nhất để thực hiện nối nhóm nhưng có một số cách khác nhau mà bạn có thể nhận được kết quả.
Bạn có thể thực hiện FOR XML PATH
và 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';
Xem SQL Fiddle với Demo .
Hoặc bạn có thể sử dụng FOR XML PATH
với 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';
Xem SQL Fiddle với Demo .
Nếu bạn muốn truy vấn các tags
giá trị, thì bạn có thể sử dụng CTE tương tự như:
;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%'
Xem bản demo
Nếu TagName
bao gồm các ký tự XML nhất định (ví dụ :) >
, &
chúng sẽ trở thành quyền ( >
-> >
, &
-> &
). Để tránh điều này, thay đổi FOR XML PATH('')
thành FOR XML PATH, TYPE).value(N'.[1]',N'nvarchar(max)')
.