FOR XML PATH

使用FOR XML PATH將多筆資料組合成一個字串

蔡雅勤 2017/12/27 04:11:34
33063

使用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 都合併了。
 

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的效能還不錯。
蔡雅勤