2016-07-26 44 views
1

我有以下的(结构化很差)表:中合并多行嵌套查询

tbl.quotes A 
quoteid | assignedID | created_by | name 
int, int, varchar, varchar 

tbl.quote_notes B 
id | quoteID | userID | noteText 
int, int, varchar, text 

tbl.admins C 
id | name 
int, varchar 

tbl.agents D 
id | name 
int, varchar 

我有以下查询,但我需要多行每个quote_notes.noteText上的每个结果的报价相结合。

SELECT 
    A.quoteid, 
    A.name, 
    C.name, 
    D.name, 
    (SELECT 
     TOP 1 notetext 
    FROM quote_notes B 
    WHERE B.quoteid = A.quoteid 
    ORDER BY dateentered DESC 
    ) AS [notes] 
    FROM quotes A 
    LEFT JOIN admins C 
     ON A.assignedid = C.id 
    LEFT JOIN agents D 
     ON A.created_by = D.id 
WHERE A.createuserid = 'agentname' 

这产生,并且不结合quote_notes.noteText多行:

12345 | Quote Name | Admin Name | Agent Name | Notes 

所需的结果:

12345 | Quote Name | Admin Name | Agent Name | Note1, Note2, Note3 

我只好写了一个while循环行结合,但不能得到它使用嵌套的select语句,因为它使用变量。它也只适用于1报价

DECLARE @rowcount INTEGER 
DECLARE @Count INTEGER 
DECLARE @note VARCHAR(MAX) 
SET @Count = 1 
SET @note = '' 
SET @rowcount = (SELECT COUNT(quoteID) FROM quote_notes WHERE quoteID = '12345') 

WHILE @Count<[email protected] 
    BEGIN 
    IF @note!='' 
     SET @note = @note+',' + (SELECT convert(varchar(max), noteText) FROM quote_notes WHERE id = @Count) 
    ELSE 
     SET @note = (SELECT noteText FROM quote_notes WHERE id = @Count) 
    SET @[email protected]+1 
    END 
SELECT @note AS note 

任何帮助,将不胜感激,谢谢!

+0

您的查询不匹配表定义。请改正。 – Serg

+0

@Serg我的歉意,我试图去掉长表名以方便阅读。我相信他们现在都匹配。 – evade

+1

请参阅http://stackoverflow.com/questions/31211506/how-stuff-and-for-xml-path-work-in-sql-server – Serg

回答

3

使用XML路径..

SELECT 
    A.quoteid, 
    A.name, 
    C.name, 
    D.name, 
     STUFF((SELECT 
     ',' +notetext 
    FROM quote_notes B 
    WHERE B.quoteid = A.quoteid 
    for xml path('') 
    ),1,1,'') 
    AS [notes] 
    FROM quotes A 
    LEFT JOIN admins C 
     ON A.assignedid = C.id 
    LEFT JOIN agents D 
     ON A.created_by = D.id 
WHERE A.createuserid = 'agentname'