选择查询以将联结表中的所有数据获取到一个字段

时间:2012-12-19 08:22:16

标签: sql sql-server-2008

我有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) 

任何人都可以帮我解决这个问题吗?感谢

1 个答案:

答案 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指令替换每行的初始','字符,并写入一个空字符串,这样字符串格式是正确的。