使用CASE 和条件聚合
SELECT ArticleID, ROOT_TOPIC_ID,
MAX (CASE WHEN level = 0 THEN Topic_name END) as Level0,
MAX (CASE WHEN level = 1 THEN Topic_name END) as Level1,
MAX (CASE WHEN level = 2 THEN Topic_name END) as Level2,
MAX (CASE WHEN level = 3 THEN Topic_name END) as Level3,
MAX (CASE WHEN level = 4 THEN Topic_name END) as Level4,
MAX (CASE WHEN level = 5 THEN Topic_name END) as Level5,
MAX (CASE WHEN level = 6 THEN Topic_name END) as Level6
FROM Topic
GROUP BY ArticleID, ROOT_TOPIC_ID
也可以使用子查询,但是在这种情况下条件聚合的性能可能会更好。
SELECT ArticleID, ROOT_TOPIC_ID,
(
SELECT top 1 Topic_name FROM Topic t WHERE t.ArticleID = Topic.ArticleID AND t.ROOT_TOPIC_ID = Topic.ROOT_TOPIC_ID AND level = 0
) as Level0,
(
SELECT top 1 Topic_name FROM Topic t WHERE t.ArticleID = Topic.ArticleID AND t.ROOT_TOPIC_ID = Topic.ROOT_TOPIC_ID AND level = 1
) as Level1,
-- an so on
FROM Topic
GROUP BY ArticleID, ROOT_TOPIC_ID