0

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

谁能帮我解决这个问题?谢谢

4

1 回答 1

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 示例

我确信这个查询可以只使用一个选择来编写,但是这样它是可读的,我可以解释代码的作用。

第一个选择将所有 Log - Category 匹配项放入表变量中。

第二部分用于FOR XML选择类别名称并以 XML 而不是表的形式返回结果。通过在选择中使用FOR XML PATH ('')并放置一个“,”,所有 XML 标记都将从结果中删除。最后,该STUFF指令替换了每行的初始 ', ' 字符并写入一个空字符串,这样字符串格式是正确的。

于 2012-12-19T08:41:08.057 回答