首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL行轉列:使用STUFF與FOR XML PATH實現多行合併

     編輯:程式設計綜合問答

需求場景

學生-科目表,一學生多科目,需查詢每生科目列表(逗號分隔):

-- 源數據
stu   | sub
張三  | 數學
李四  | 歷史
李四  | 音樂
李四  | 英語
張三  | 音樂

-- 目標結果
stu   | sub
張三  | 數學,音樂
李四  | 歷史,音樂,英語

SQL Server解法(STUFF + FOR XML PATH)

SELECT stu,
       STUFF((
           SELECT ',' + sub
           FROM Students a
           WHERE a.stu = b.stu
           FOR XML PATH('')
       ), 1, 1, '') AS sub
FROM Students b
GROUP BY stu;

關鍵點解析

  1. FOR XML PATH(''):將查詢結果按行拼接為XML片段,無標籤名產生純文本,數學,音樂。
  2. STUFF(str, 1, 1, ''):刪除首字符逗號,得到數學,音樂。
  3. 相關子查詢WHERE a.stu = b.stu確保按學生分組拼接。

其他數據庫方案

數據庫函數/語法示例
MySQL 8.0+GROUP_CONCATSELECT stu, GROUP_CONCAT(sub) FROM Students GROUP BY stu
PostgreSQLSTRING_AGGSELECT stu, STRING_AGG(sub, ',') FROM Students GROUP BY stu
Oracle 11gR2+LISTAGGSELECT stu, LISTAGG(sub, ',') WITHIN GROUP (ORDER BY sub) FROM Students GROUP BY stu

性能提示

  • 大數據量時,FOR XML PATH較慢;可考慮CLR聚合函數或應用層拼接。
  • 確保sub字段無NULL,否則導致整行結果為NULL(用ISNULL(sub,'')處理)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved