2012-12-19 32 views
0

我有2个表和1个结表:表1和2之间选择查询来获取结表中的所有数据到一个场

table 1 (Log):  | Id | Title | Date | ... 
table 2 (Category): | Id | Title | ... 

结表:

LogCategory: | Id | LogId | CategoryId 

现在,我想一个SQL查询来获取所有类别的标题所有日志在一个领域, 是这样的:

LogId, LogTitle, ..., Categories(that contains all category title assigned to this log id) 

CAN任何一个帮我解决这个问题?感谢

回答

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

我敢肯定,这个查询可以只使用一个选择写,但这种方式是可读的,我可以解释代码做了什么。

的第一选择通吃日志 - 种类匹配到一个表变量。

第二部分使用FOR XML选择类别名称并以XML,而不是在一个表中返回结果。通过使用​​并在选择中放置',',将从结果中删除所有XML标记。 最后,STUFF指令取代每一行的初始“”人物,而是写一个空字符串,这样的字符串格式化是正确的。

+0

感激但这查询使计算机的RAM满 –

相关问题