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

如何合并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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:39:04