You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForms下SQL多表关联查询如何将匹配多值合并至同一行

问题根因

你查询出现大量冗余行是典型的一对多关联结果膨胀:表A的单条记录可匹配表B的多条记录时,普通JOIN会为每一条匹配的B表记录单独生成一行,自然每行只会携带一个B表3列的值。要实现所有匹配的B表3列值合并到同一A表结果行,直接用数据库内置的字符串聚合函数搭配分组即可,不需要额外做二次结果处理。

核心实现步骤
  • 先明确需要查询的表A目标列:即你提到的1、2、3列
  • 按关联条件[B].[2] = [A].[1]匹配跨库的表B数据
  • 对匹配到的所有B表3列值做聚合拼接,按A表的查询列做分组,保证单条A表记录只返回一行结果
各数据库具体实现代码

跨库访问只要两个库部署在同一个数据库实例下,直接在表名前拼接库名前缀即可,不需要额外配置数据链路。

MySQL / SQL Server 2017+ / PostgreSQL

SELECT 
  A.[1],
  A.[2],
  A.[3],
  -- 分隔符可根据需求替换为分号、顿号等
  -- SQL Server/PostgreSQL 用STRING_AGG
  STRING_AGG(B.[3], ',') AS merged_B_col3
  -- MySQL 替换为下一行即可
  -- GROUP_CONCAT(B.[3] SEPARATOR ',') AS merged_B_col3
FROM 库A.表A A
LEFT JOIN 库B.表B B 
  ON B.[2] = A.[1]
GROUP BY A.[1], A.[2], A.[3];

如果需要对B表匹配值去重,直接在聚合函数内加DISTINCT关键字即可,例如STRING_AGG(DISTINCT B.[3], ',')。

SQL Server 2016及更早版本

老版本SQL Server没有内置STRING_AGG函数,通过FOR XML PATH实现聚合:

SELECT 
  A.[1],
  A.[2],
  A.[3],
  STUFF(
    (SELECT ',' + CAST(B.[3] AS VARCHAR(MAX))
     FROM 库B.表B B 
     WHERE B.[2] = A.[1]
     FOR XML PATH(''), TYPE
    ).value('.', 'VARCHAR(MAX)'),
  1, 1, '') AS merged_B_col3
FROM 库A.表A A
GROUP BY A.[1], A.[2], A.[3];

Oracle

Oracle使用LISTAGG函数实现聚合:

SELECT 
  A."1",
  A."2",
  A."3",
  LISTAGG(B."3", ',') WITHIN GROUP (ORDER BY B."3") AS merged_B_col3
FROM 库A所属用户.表A A
LEFT JOIN 库B所属用户.表B B
  ON B."2" = A."1"
GROUP BY A."1", A."2", A."3";
注意事项
  • 如果B表的3列是数值、日期等非字符串类型,聚合前先显式转为字符串类型,避免隐式转换报错
  • 如果需要对合并后的B表值排序,在聚合函数内指定排序规则即可,例如PostgreSQL中写STRING_AGG(B.[3], ',' ORDER BY B.[3])
  • 若两个库不在同一个数据库实例,先配置跨实例链路(比如MySQL的FEDERATED引擎、SQL Server的链接服务器),再按上述逻辑写查询即可

内容的提问来源于stack exchange,提问作者Patros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:18:18