Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择“查询”以将连接表中的所有数据获取到一个字段_Sql_Sql Server 2008 - Fatal编程技术网

Sql 选择“查询”以将连接表中的所有数据获取到一个字段

Sql 选择“查询”以将连接表中的所有数据获取到一个字段,sql,sql-server-2008,Sql,Sql Server 2008,我有两张桌子和一张连接桌: table 1 (Log): | Id | Title | Date | ... table 2 (Category): | Id | Title | ... 表1和表2之间的连接表: LogCategory: | Id | LogId | CategoryId 现在,我需要一个sql查询来获取一个字段中所有类别标题的所有日志, 大概是这样的: LogId, LogTitle, ..., Categories(that contains all cat

我有两张桌子和一张连接桌:

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) 
有谁能帮我解决这个问题吗?谢谢

请尝试以下代码:

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
这里有一个简单的例子

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

第一个选择将所有日志类别匹配项放入一个表变量中

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