このコードを試してください:
DECLARE @results TABLE
(
idLog int,
LogTitle varchar(20),
idCategory int,
CategoryTitle varchar(20)
)
INSERT INTO @results
SELECT l.idLog, l.LogTitle, c.idCategory, c.CategoryTitle
FROM
LogCategory lc
INNER JOIN Log l
ON lc.IdLog = l.IdLog
INNER JOIN Category c
ON lc.IdCategory = c.IdCategory
SELECT DISTINCT
idLog,
LogTitle,
STUFF (
(SELECT ', ' + r1.CategoryTitle
FROM @results r1
WHERE r1.idLog = r2.idLog
ORDER BY r1.idLog
FOR XML PATH ('')
), 1, 2, '')
FROM
@results r2
ここに簡単なSQLフィドルの例があります
このクエリは1つの選択だけを使用して記述できると確信していますが、この方法で読み取り可能であり、コードの機能を説明できます。
最初の選択では、すべてのログ-カテゴリの一致がテーブル変数に取り込まれます。
2番目の部分はFOR XML
、カテゴリ名を選択し、結果をテーブルではなくXMLで返すために使用します。FOR XML PATH ('')
'、'を使用して選択に配置すると、すべてのXMLタグが結果から削除されます。そして最後に、STUFF
命令はすべての行の最初の'、'文字を置き換え、代わりに空の文字列を書き込みます。これにより、文字列のフォーマットが正しくなります。