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

如何关联两张表并将多行数据合并为单行(逗号分隔)展示?

关联表多行合并为单行的实现方案

嘿,这个需求我太熟悉了!要把关联两张表查出来的多行数据,按特定维度合并成单行展示(比如把同一个Particulars对应的多个值拼成1,2,3这样的格式),不同数据库有不同的专属函数来实现,我给你整理了常用数据库的解决方案,直接就能用:

MySQL/MariaDB 方案

用GROUP_CONCAT()函数,这是MySQL里专门用来聚合拼接字符串的工具:

SELECT 
    p.particulars_name AS Particulars,
    'Info Abc' AS Info, -- 如果这个值来自主表,换成对应的字段名即可
    GROUP_CONCAT(d.info_value SEPARATOR ',') AS CombinedValues
FROM particulars_table p
JOIN info_table d ON p.id = d.particulars_id
GROUP BY p.particulars_name, 'Info Abc';
  • 小提示:如果要去重,可以加DISTINCT,比如GROUP_CONCAT(DISTINCT d.info_value SEPARATOR ',')
  • 默认拼接长度有限制,要是字符串太长,可以通过SET GLOBAL group_concat_max_len = 10240;调整上限

SQL Server 方案

SQL Server 2017及以上版本支持STRING_AGG()函数,用法更简洁:

SELECT 
    p.particulars_name AS Particulars,
    'Info Abc' AS Info,
    STRING_AGG(d.info_value, ',') AS CombinedValues
FROM particulars_table p
JOIN info_table d ON p.id = d.particulars_id
GROUP BY p.particulars_name, 'Info Abc';
  • 同样支持去重:STRING_AGG(DISTINCT d.info_value, ',')
  • 如果需要按特定顺序拼接,可以加WITHIN GROUP (ORDER BY d.info_value)

Oracle 方案

Oracle 11gR2及以上用LISTAGG()函数,还能指定拼接顺序:

SELECT 
    p.particulars_name AS Particulars,
    'Info Abc' AS Info,
    LISTAGG(d.info_value, ',') WITHIN GROUP (ORDER BY d.info_value) AS CombinedValues
FROM particulars_table p
JOIN info_table d ON p.id = d.particulars_id
GROUP BY p.particulars_name, 'Info Abc';
  • WITHIN GROUP (ORDER BY ...)是可选的,但加上能让拼接后的字符串更有序

PostgreSQL 方案

PostgreSQL有两种常用方式,用STRING_AGG()或者ARRAY_AGG()转字符串:

方式1:STRING_AGG

SELECT 
    p.particulars_name AS Particulars,
    'Info Abc' AS Info,
    STRING_AGG(d.info_value, ',') AS CombinedValues
FROM particulars_table p
JOIN info_table d ON p.id = d.particulars_id
GROUP BY p.particulars_name, 'Info Abc';

方式2:ARRAY_AGG转字符串

SELECT 
    p.particulars_name AS Particulars,
    'Info Abc' AS Info,
    ARRAY_TO_STRING(ARRAY_AGG(d.info_value), ',') AS CombinedValues
FROM particulars_table p
JOIN info_table d ON p.id = d.particulars_id
GROUP BY p.particulars_name, 'Info Abc';

通用注意事项

  1. GROUP BY 规则:所有非聚合字段(比如Particulars、Info)必须出现在GROUP BY子句里,不然会触发数据库的聚合规则报错
  2. NULL值处理:如果要拼接的字段有NULL,默认会被忽略,要是想保留可以用COALESCE(d.info_value, '')把NULL转成空字符串
  3. 长度限制:部分数据库对拼接后的字符串长度有默认上限,遇到超长内容记得调整对应参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:41:39