[食譜好菜] SQL Server 使用「FOR XML」語法做欄位合併

在 SQL Sever 中要將不同 Row 的某個欄位裡面的值合併起來用,若單純自己土砲那是一件非常辛苦的事情,幸好 SQL Server 提供了 FOR XML 語法,搭配 PATH 模式就能輕鬆做到。

假設我有一個資料表 ProductOwner 它長這樣。

而我想要 SELECT 出這樣的結果。

則語法該怎麼下呢?

使用 FOR XML 語法合併欄位

首先先使用 FOR XML 語法搭配 PATH 模式把欄位合併的結果先 SELECT 出來。

SELECT ProductId,
    (
        SELECT ',' + PO_A.[Owner]
        FROM ProductOwner PO_A
        WHERE PO_A.ProductId = PO_B.ProductId
        FOR XML PATH('')
        ) AS Owners
FROM ProductOwner PO_B

使用 DISTINCT 語法過濾重複的資料

SELECT DISTINCT ProductId,
    (
        SELECT ',' + PO_A.[Owner]
        FROM ProductOwner PO_A
        WHERE PO_A.ProductId = PO_B.ProductId
        FOR XML PATH('')
        ) AS Owners
FROM ProductOwner PO_B

使用 STUFF 去除掉第一個多餘的逗號

SELECT DISTINCT ProductId,
    STUFF((
            SELECT ',' + PO_A.[Owner]
            FROM ProductOwner PO_A
            WHERE PO_A.ProductId = PO_B.ProductId
            FOR XML PATH('')
            ), 1, 1, '') AS Owners
FROM ProductOwner PO_B
SUTFF 函式的表達式是這樣的 STUFF(原字串, 起始位置, 移除長度, 替換字串)

大功告成!

參考資料