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 句が増えるとうまくいかないように見えるからです。私の「実際の」コードでは、1 つの行からのみ値を取得します。

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 に答える