求助:如何基于OT_ID合并多行数据?STING_AGG语法报错
解决按ID合并字段值的语法错误问题
问题分析
你原查询的核心问题有两个:
- 错误地进行了多表关联,根据你给出的示例数据,所有需要的字段都在同一张表内,无需关联
test/test1/optn/addtopn这些表; - 尝试的聚合函数拼写错误(
STING_AGG应为STRING_AGG),且未配合GROUP BY子句使用,这是导致语法错误的直接原因。
正确解决方案
根据你需要按OT_ID合并OPTION和OPTION2字段的需求,以下是不同数据库环境下的可行SQL:
SQL Server
SELECT OT_ID, CODE, STRING_AGG([OPTION], ',') WITHIN GROUP (ORDER BY (SELECT NULL)) AS [OPTION], STRING_AGG(OPTION2, ',') WITHIN GROUP (ORDER BY (SELECT NULL)) AS OPTION2 FROM your_table_name -- 替换为你的实际表名 GROUP BY OT_ID, CODE;
注:[OPTION]中的方括号是因为OPTION是SQL关键字,必须转义;ORDER BY (SELECT NULL)表示保留原表数据的顺序,如需指定排序逻辑可替换为具体字段。
MySQL
SELECT OT_ID, CODE, GROUP_CONCAT(`OPTION` SEPARATOR ',') AS `OPTION`, GROUP_CONCAT(OPTION2 SEPARATOR ',') AS OPTION2 FROM your_table_name GROUP BY OT_ID, CODE;
PostgreSQL
SELECT OT_ID, CODE, STRING_AGG("OPTION", ',' ORDER BY (SELECT NULL)) AS "OPTION", STRING_AGG(OPTION2, ',' ORDER BY (SELECT NULL)) AS OPTION2 FROM your_table_name GROUP BY OT_ID, CODE;
或使用array_agg配合array_to_string:
SELECT OT_ID, CODE, array_to_string(array_agg("OPTION"), ',') AS "OPTION", array_to_string(array_agg(OPTION2), ',') AS OPTION2 FROM your_table_name GROUP BY OT_ID, CODE;
Oracle
SELECT OT_ID, CODE, LISTAGG("OPTION", ',') WITHIN GROUP (ORDER BY NULL) AS "OPTION", LISTAGG(OPTION2, ',') WITHIN GROUP (ORDER BY NULL) AS OPTION2 FROM your_table_name GROUP BY OT_ID, CODE;
关键说明
- 必须按
OT_ID和CODE分组:因为同一OT_ID对应的CODE值一致,分组后才能将同组的字段值进行聚合合并; - 关键字转义:
OPTION是SQL保留关键字,不同数据库的转义方式不同,必须转义才能避免语法错误。
内容的提问来源于stack exchange,提问作者Lvh
相关产品推荐
相关产品推荐

