我有2个表和1个联结表:
table 1 (Log): | Id | Title | Date | ...
table 2 (Category): | Id | Title | ...
表1和表2之间的联结表:
LogCategory: | Id | LogId | CategoryId
现在,我想要一个SQL查询来获取所有类别标题在一个字段中的所有日志, 像这样的东西:
LogId, LogTitle, ..., Categories(that contains all category title assigned to this log id)
任何人都可以帮我解决这个问题吗?感谢
答案 0 :(得分:2)
试试这段代码:
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 example
我确信这个查询只能使用一个select来编写,但这样它是可读的,我可以解释代码的用途。
第一个选择将所有Log-Category匹配变为表变量。
第二部分使用FOR XML
选择类别名称,并以XML而不是表格的形式返回结果。通过使用FOR XML PATH ('')
并在select中放置',',将从结果中删除所有XML标记。
最后,STUFF
指令替换每行的初始','字符,并写入一个空字符串,这样字符串格式是正确的。