Kết hợp trường một-nhiều trong kết quả duy nhất?


7

Nói rằng tôi có truy vấn sau đây:

SELECT * 
FROM AppDetails, AppTags 
WHERE AppDetails.AppID = '1' 
  AND AppDetails.AppID = AppTags.AppID

Cho kết quả như sau:

AppID    AppName        AppType    Tag
1        Application1   Utility    Test1
1        Application1   Utility    Test2
1        Application1   Utility    Test3

Làm cách nào tôi có thể sửa đổi truy vấn để trả về một cái gì đó như thế này:

AppID    AppName        AppType    Tags
1        Application1   Utility    Test1,Test2,Test3

Câu trả lời:


10

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 PATHSTUFF():

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 PATHvớ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 tagsgiá 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 TagNamebao 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)').

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.