FOR XML PATH
使用FOR XML PATH將多筆資料組合成一個字串
2017/12/27 04:11:34
0
39280
使用FOR XML PATH將多筆資料組合成一個字串
簡介 |
SQL Server 中如何將多筆資料列中屬於同一群組的字串組合起來呢 ? 可利用 CTE (COMMON TABLE EXPRESSION) 或是 FOR XML 語法,搭配 PATH 模式等兩種方式來解決。本篇則介紹FOR XML 語法,搭配 PATH 模式的使用範例。 |
作者 |
蔡雅勤 |
1. 前言:
在SQL Server中要將多筆資料中某個欄位的值合併起來,可以使用 CTE (COMMON TABLE EXPRESSION) 的方式。除了CTE 之外, SQL Server 提供了 FOR XML 語法,搭配 PATH 模式,也可以輕鬆達到同樣的效果,效能也不錯。
2. 實作範例:
假設有個「組別清單」的資料表
希望查詢顯示結果如下:
3. 實作步驟:
Step1:先讓我們看看TEAMID= 1的人員有哪些?
語法:
SELECT * FROM TEAMLIST WHERE TEAMID = 1
查詢結果:
顯示有四筆資料。
Step2:利用FOR XML PATH把它合併顯示
語法:
SELECT ',' + NAME FROM TEAMLIST WHERE TEAMID = 1
FOR XML PATH('')
查詢結果:
輸出結果可以發現TEAMID=1 的NAME 都合併了。
輸出結果可以發現TEAMID=1 的NAME 都合併了。
Step3:然後改成顯示所有的TEAMID
語法:
SELECT TEAMID,
(
SELECT ',' + A.NAME FROM TEAMLIST A WHERE A.TEAMID = B.TEAMID
FOR XML PATH('')
) AS NAME
FROM TEAMLIST B
查詢結果:
顯示出來的資料有重複。
Step4:利用DISTINCT 語法過濾重複的資料
語法:
SELECT DISTINCT TEAMID,
(
SELECT ',' + A.NAME FROM TEAMLIST A WHERE A.TEAMID = B.TEAMID
FOR XML PATH('')
) AS NAME
FROM TEAMLIST B
查詢結果:
顯示所有組別清單,但是NAME欄位還多一個逗號。
Step5:使用 STUFF 去除掉第一個多餘的逗號
語法:
SELECT DISTINCT TEAMID,
STUFF( (
SELECT ',' + A.NAME FROM TEAMLIST A WHERE A.TEAMID = B.TEAMID
FOR XML PATH('')
), 1, 1, '') AS NAME
FROM TEAMLIST B
最後查詢結果:
4. 結論:
實際操作起來FOR XML PATH 語法還挺好理解的,有相關的需求可以考慮此方式來查詢。
如果有效能上的考慮,看過下面連結暗黑執行緒-欄位合併效能比較:CTE VS FOR XML的文章,就可知道FOR XML PATH的效能還不錯。