如何将TableB中关联key的列值合并到TableA的单列中?
合并TableB多行数据到TableA单列的SQL方案
你原来的SQL语句会报错,因为CONCAT()只能处理单个值,而嵌套的子查询会返回多行结果。需要使用对应数据库的字符串聚合函数,将TableB中同一keyA对应的多行col值合并为单个空格分隔的字符串,再更新到TableA中。以下是主流数据库的实现方案:
MySQL(5.7及以上版本)
使用GROUP_CONCAT函数,指定分隔符为空格:
UPDATE tableA a SET column = ( SELECT GROUP_CONCAT(b.col SEPARATOR ' ') FROM tableB b WHERE a.key = b.keyA GROUP BY b.keyA );
SQL Server
2017及以上版本(支持STRING_AGG)
UPDATE a SET a.column = b.concatenated_col FROM tableA a INNER JOIN ( SELECT keyA, STRING_AGG(col, ' ') AS concatenated_col FROM tableB GROUP BY keyA ) b ON a.key = b.keyA;
旧版本SQL Server(无STRING_AGG)
用FOR XML PATH拼接字符串,再用STUFF去掉开头多余的空格:
UPDATE a SET a.column = STUFF( (SELECT ' ' + col FROM tableB b WHERE b.keyA = a.key FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '' ) FROM tableA a;
PostgreSQL
使用STRING_AGG函数:
UPDATE tableA a SET column = ( SELECT STRING_AGG(b.col, ' ') FROM tableB b WHERE a.key = b.keyA GROUP BY b.keyA );
注意事项
- 执行更新前务必备份TableA和TableB的数据,防止数据丢失或错误
- 确认TableA的
column字段长度足够,避免合并后的字符串被截断 - 验证更新结果无误后,再执行
DROP TABLE tableB;删除TableB
内容的提问来源于stack exchange,提问作者vogomatix
相关产品推荐
相关产品推荐

