如何合并SQL查询结果的指定列并保留其余字段的原有值
解决方案
你之前使用distinct或普通group by无法实现的原因是:distinct只能对整行去重,不会合并同分组下的多个user_poi_no值;未搭配聚合函数的group by只会保留分组内的第一条user_poi_no,会丢失其他数据。你需要搭配对应数据库的字符串拼接聚合函数实现需求,不同数据库的实现方式如下:
MySQL 实现
select GROUP_CONCAT(CAST(user_poi_no AS CHAR) SEPARATOR ' ') as user_poi_no, tm.id, modelName, item, projectName from tb_user_poi p inner join tb_member tm on p.id_pk = tm.id_pk inner join tb_poi tp on p.poiNo = tp.poiNo inner join tb_model t on tp.modelNo = t.modelNo where tm.id_pk = 1 group by tm.id, modelName, item, projectName;
说明:GROUP_CONCAT默认分隔符为逗号,这里通过SEPARATOR ' '指定用空格分隔,CAST是为了避免数值类型隐式转换导致的异常。
PostgreSQL / SQL Server 实现
使用STRING_AGG函数:
-- PostgreSQL写法 select STRING_AGG(user_poi_no::text, ' ') as user_poi_no, tm.id, modelName, item, projectName from tb_user_poi p inner join tb_member tm on p.id_pk = tm.id_pk inner join tb_poi tp on p.poiNo = tp.poiNo inner join tb_model t on tp.modelNo = t.modelNo where tm.id_pk = 1 group by tm.id, modelName, item, projectName;
如果是SQL Server,将user_poi_no::text替换为CAST(user_poi_no AS VARCHAR)即可。
Oracle 实现
使用LISTAGG函数:
select LISTAGG(user_poi_no, ' ') WITHIN GROUP (ORDER BY user_poi_no) as user_poi_no, tm.id, modelName, item, projectName from tb_user_poi p inner join tb_member tm on p.id_pk = tm.id_pk inner join tb_poi tp on p.poiNo = tp.poiNo inner join tb_model t on tp.modelNo = t.modelNo where tm.id_pk = 1 group by tm.id, modelName, item, projectName;
内容的提问来源于stack exchange,提问作者ringhiosi
相关产品推荐
相关产品推荐

