如何将关联表多条查询结果拼接为单个字段?解决SQL1242报错
错误原因
1242报错的核心原因是你写的标量子查询返回了多行结果:对于first表中的同一个id,second表可能匹配到多条关联记录,而标量子查询语法要求单次执行最多只能返回1行1列的结果,因此触发数据库报错。
正确实现方案
不同数据库的多行字符串拼接函数有差异,主流数据库的实现方式如下:
MySQL
使用GROUP_CONCAT函数完成拼接:
SELECT first.id, GROUP_CONCAT(second.value ORDER BY second.id SEPARATOR '-') AS value FROM first LEFT JOIN second ON first.id = second.first_id GROUP BY first.id;
参数说明:
ORDER BY second.id可选,用于指定拼接时value的先后顺序SEPARATOR '-'显式指定拼接分隔符为短横线,省略时默认用逗号作为分隔符- 使用
LEFT JOIN可以保留first表中无关联记录的id(如示例中的id=2、3),对应的value返回NULL;如果不需要无关联的记录,可改为INNER JOIN - 如果希望无关联记录时value显示为空字符串,可修改为
COALESCE(GROUP_CONCAT(second.value ORDER BY second.id SEPARATOR '-'), '') AS value
PostgreSQL
使用STRING_AGG函数:
SELECT first.id, STRING_AGG(second.value, '-' ORDER BY second.id) AS value FROM first LEFT JOIN second ON first.id = second.first_id GROUP BY first.id;
Oracle(11g及以上版本)
使用LISTAGG函数:
SELECT first.id, LISTAGG(second.value, '-') WITHIN GROUP (ORDER BY second.id) AS value FROM first LEFT JOIN second ON first.id = second.first_id GROUP BY first.id;
以上SQL执行后,first.id=1对应的value结果就是你需要的a1-a2-a3。
内容的提问来源于stack exchange,提问作者user16186155
相关产品推荐
相关产品推荐

