FOR XML PATH
								
							
						
					
					
					使用FOR XML PATH將多筆資料組合成一個字串
								
								
								2017/12/27 04:11:34
							
							
								
									
										 
												 0
										
										
									
									
								
								 44941
							
						使用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的效能還不錯。
    
    
    
						 
								 
								 
								 
								 
								 
								 
								 
								 
								 
								 
								 
								