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

SQL Server 一對多查詢:主表關聯子表多行合併為單行逗號分隔

     編輯:程式設計綜合問答

場景

A 表 (id, name),B 表 (bid, name, pid 外鍵關聯 A.id)。需求:查詢 A 表每行,關聯 B 表所有 name 以逗號合併顯示。

SQL Server 方案:STUFF + FOR XML PATH

SELECT a.*, r.data
FROM A a
LEFT JOIN (
    SELECT pid, 
           data = STUFF((
               SELECT ',' + name 
               FROM B t 
               WHERE t.pid = t1.pid 
               FOR XML PATH('')
           ), 1, 1, '')
    FROM B t1
    GROUP BY pid
) r ON a.id = r.pid;

關鍵函數解析

  • FOR XML PATH(''):將多行結果串聯為無標籤 XML 片段(如 ,王五,張飛)。
  • STUFF(str, 1, 1, ''):移除首字元逗號,得到 王五,張飛。
  • LEFT JOIN:保留無子記錄的 A 表行(data 為 NULL)。

SQL Server 2017+ 更簡潔:STRING_AGG

SELECT a.id, a.name, STRING_AGG(b.name, ',') AS names
FROM A a
LEFT JOIN B b ON a.id = b.pid
GROUP BY a.id, a.name;

MySQL/PostgreSQL 對應

  • MySQL: GROUP_CONCAT(b.name SEPARATOR ',')
  • PostgreSQL: STRING_AGG(b.name, ',')
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved