2016-07-26 80 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'