6. ふつうのSQLでなら……
こんな感じ?
WITH
Indexed (name, i, skill) AS(
SELECT name, ROW_NUMBER() OVER(PARTITION BY name ORDER BY skill), skill
FROM Skills
)
SELECT
s1.name AS name, s1.skill + ', ' + s2.skill AS skills
FROM
Indexed s1 実行結果
INNER JOIN Indexed s2 ON
s1.name = s2.name name skills
WHERE
s1.i = 1 AND s2.i = 2 miyazaki F#, SQL
hayame Blaze, Flamer
hayameはスキルを3つ持っているのに2つしか結合されていない。
使えないではないか……
8. 再帰CTEバージョン
WITH
Indexed (name, i, skill) AS(
SELECT name, ROW_NUMBER() OVER(PARTITION BY name ORDER BY skill), skill
FROM Skills
)
, StringSum (name, i, skill) AS(
SELECT name, i, CAST(skill AS VARCHAR(MAX))
FROM Indexed
WHERE i = 1
UNION ALL
StringSum.skill + ', ' + Indexed.skill
SELECT StringSum.name, Indexed.i,
FROM StringSum -- ここで再帰してる
INNER JOIN Indexed ON
StringSum.name = Indexed.name AND StringSum.i + 1 = Indexed.i
)
実行結果
SELECT name, skill
FROM StringSum name skills
WHERE i = (SELECT MAX(i)
FROM StringSum c miyazaki F#, SQL
WHERE c.name = StringSum.name)
hayame Blaze, Flamer, HailStorm