试试这个代码:
DECLARE @results TABLE
(
idLog int,
LogTitle varchar(20),
idCategory int,
CategoryTitle varchar(20)
)
INSERT INTO @results
SELECT l.idLog, l.LogTitle, c.idCategory, c.CategoryTitle
FROM
LogCategory lc
INNER JOIN Log l
ON lc.IdLog = l.IdLog
INNER JOIN Category c
ON lc.IdCategory = c.IdCategory
SELECT DISTINCT
idLog,
LogTitle,
STUFF (
(SELECT ', ' + r1.CategoryTitle
FROM @results r1
WHERE r1.idLog = r2.idLog
ORDER BY r1.idLog
FOR XML PATH ('')
), 1, 2, '')
FROM
@results r2
这里有一个简单的SQL Fiddle 示例
我确信这个查询可以只使用一个选择来编写,但是这样它是可读的,我可以解释代码的作用。
第一个选择将所有 Log - Category 匹配项放入表变量中。
第二部分用于FOR XML
选择类别名称并以 XML 而不是表的形式返回结果。通过在选择中使用FOR XML PATH ('')
并放置一个“,”,所有 XML 标记都将从结果中删除。最后,该STUFF
指令替换了每行的初始 ', ' 字符并写入一个空字符串,这样字符串格式是正确的。