名前を保持する 3 つの行を持つデータベース テーブルを考えてみましょう。
Peter
Paul
Mary
これを単一の文字列に変換する簡単な方法はありますかPeter, Paul, Mary
?
ベストアンサー1
SQL Server 2017またはAzureを使用している場合は、マチュー・レンダの回答。
1 対多の関係を持つ 2 つのテーブルを結合しようとしたときに、同様の問題が発生しました。SQL 2005 では、このXML PATH
メソッドで行の連結を非常に簡単に処理できることが分かりました。
というテーブルがある場合STUDENTS
SubjectID StudentName
---------- -------------
1 Mary
1 John
1 Sam
2 Alaina
2 Edward
予想した結果は次のとおりです:
SubjectID StudentName
---------- -------------
1 Mary, John, Sam
2 Alaina, Edward
私は以下を使用しましたT-SQL
:
SELECT Main.SubjectID,
LEFT(Main.Students,Len(Main.Students)-1) As "Students"
FROM
(
SELECT DISTINCT ST2.SubjectID,
(
SELECT ST1.StudentName + ',' AS [text()]
FROM dbo.Students ST1
WHERE ST1.SubjectID = ST2.SubjectID
ORDER BY ST1.SubjectID
FOR XML PATH (''), TYPE
).value('text()[1]','nvarchar(max)') [Students]
FROM dbo.Students ST2
) [Main]
先頭のカンマを連結し、 を使用してsubstring
最初のカンマをスキップすれば、サブクエリを実行する必要がなくなり、同じことをよりコンパクトな方法で実行できます。
SELECT DISTINCT ST2.SubjectID,
SUBSTRING(
(
SELECT ','+ST1.StudentName AS [text()]
FROM dbo.Students ST1
WHERE ST1.SubjectID = ST2.SubjectID
ORDER BY ST1.SubjectID
FOR XML PATH (''), TYPE
).value('text()[1]','nvarchar(max)'), 2, 1000) [Students]
FROM dbo.Students ST2