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 子句打破了。在我的“真实”代码中,我只从一行中获取值。

4

1 回答 1

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

样本输出:

| 结果 |
-----------------------------------------------------------
| 你能重复这个问题吗;也许;否;是 |
| 你真的能重复这个问题吗;当然;是的 |

这是SQLFiddle演示

如果有可能有问题但尚未分配答案,并且您想正确显示它们,您可以使用ISNULL()or 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

样本输出:

| 结果 |
-------------------------------------------------- --------
| 你能重复这个问题吗;也许;否;是 |
| 你真的能重复这个问题吗;当然;是的 |
| 一个问题可以没有答案吗?[对不起,还没有答案] |

这是SQLFiddle演示

于 2013-06-21T05:35:29.487 回答