2013-06-21 45 views
0

這是一個有效的SQL,它將多個記錄的列值附加到單個字符串結果中嗎?將多個行的列值附加到字符串中

DECLARE @Result NVARCHAR(MAX) 
SET @Result = '' 

SELECT @Result = @Result + Answer + ';' 
FROM Answers A 
WHERE A.Quiz_ID = 1 AND A.Question_Id = 1 
ORDER BY Answer 

Select @Result [List Of Answers] 

結果應該是這樣的:

Can You Repeat The Question;No;Yes; 

這僅僅是一個例子。我的問題是這個有效的SQL?我問的原因是這種技術似乎在我的真實代碼中有更多的連接和ORDER BY子句。在我的「真實」代碼中,我只能從一行中獲得值。

+3

你試圖運行呢? –

回答

3

要實現你的目標,你需要使用STUFF()GROUP BY

SELECT q.Question + ';' + 
     STUFF((SELECT ';' + Answer 
       FROM Answers 
       WHERE Question_Id = q.Question_Id 
       ORDER BY 1 
       FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,'') result 
    FROM Questions q LEFT JOIN Answers a 
    ON q.Question_Id = a.Question_Id 
GROUP BY q.Question_Id, q.Question 

輸出示例:

 
|          RESULT | 
----------------------------------------------- 
| Can You Repeat The Question;Maybe;No;Yes | 
| Can You Really Repeat The Question;Sure;Yes | 

這裏是SQLFiddle演示

如果有問題的可能性沒有答案被分配,你想正確顯示T.您可以使用ISNULL()COALESCE()(例如:注入默認值)

SELECT q.Question + ';' + 
     ISNULL(STUFF((SELECT ';' + Answer 
       FROM Answers 
       WHERE Question_Id = q.Question_Id 
       ORDER BY 1 
       FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,''), 
     '[Sorry, no answers yet]') result 
    FROM Questions q LEFT JOIN Answers a 
    ON q.Question_Id = a.Question_Id 
    GROUP BY q.Question_Id, q.Question 

輸出示例:

 
|             RESULT | 
---------------------------------------------------------- 
|    Can You Repeat The Question;Maybe;No;Yes | 
|   Can You Really Repeat The Question;Sure;Yes | 
| Can a question have no answers;[Sorry, no answers yet] | 

這裏是SQLFiddle演示

+0

+1 - 爲了好的答案。 – Devart

+0

感謝SQLFiddle演示 – BrianK

+0

@BrianK您不止歡迎:)祝您好運。 – peterm