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

SQL查询单条数据重复显示4次问题排查求助

问题分析与解决方案

错误根源

你的问题核心是同时左连接两个与cars表为一对多关系的表(cars_images和cars_equipment),产生了笛卡尔积:

  • 假设某辆车关联4个设备、N张图片,连接后会生成4×N条重复的车辆主数据,每条对应一组「图片+设备」的组合。
  • 当GROUP BY包含ce.id时,相当于按单个设备分组,最终结果行数等于车辆的设备数量(你这里是4行),每行的车辆主数据完全重复。
  • 移除ce.id后,GROUP BY仅按c.id分组,但聚合的是笛卡尔积后的所有记录,导致array_agg会把重复的图片/设备多次聚合,出现大量重复值或null(比如无图片时会生成4×N个null,设备名称重复N次)。

正确解决方案

推荐使用先聚合子表再关联的方式,从根源避免笛卡尔积,性能更优且结果准确:

SELECT
    c.id,
    c.model,
    c.description,
    c.environment,
    c.equipment,
    c.ps,
    c.tuv,
    c.cover,
    c.brand,
    c.price,
    c.engine,
    c.fuel,
    c.firstregistration,
    c.km,
    c.color,
    c.video,
    c.type,
    c.show,
    c.sit_place,
    ci.images,
    ce.equipments
FROM 
    cars c
LEFT JOIN (
    -- 先聚合单辆车的所有图片
    SELECT car_id, array_agg(image) as images
    FROM cars_images
    GROUP BY car_id
) ci ON ci.car_id = c.id
LEFT JOIN (
    -- 先聚合单辆车的所有设备
    SELECT car_id, array_agg(name) as equipments
    FROM cars_equipment
    GROUP BY car_id
) ce ON ce.car_id = c.id
WHERE 
    c.show IS TRUE AND c.id = $1 
LIMIT 1;

如果临时需要快速修复,也可以在聚合时用DISTINCT去重(但不推荐大数据量场景,因为笛卡尔积仍会生成大量中间数据):

SELECT
    c.id,
    c.model,
    c.description,
    c.environment,
    c.equipment,
    c.ps,
    c.tuv,
    c.cover,
    c.brand,
    c.price,
    c.engine,
    c.fuel,
    c.firstregistration,
    c.km,
    c.color,
    c.video,
    c.type,
    c.show,
    c.sit_place,
    array_agg(DISTINCT ci.image) as images,
    array_agg(DISTINCT ce.name) as equipments
FROM 
    cars c
LEFT JOIN 
    cars_images ci ON ci.car_id = c.id
LEFT JOIN 
    cars_equipment ce ON ce.car_id = c.id
WHERE 
    c.show IS TRUE AND c.id = $1 
GROUP BY 
    c.id
LIMIT 1;

注意:DISTINCT会过滤掉重复的图片/设备名称,如果业务允许存在重复值,这种方法不适用。

内容的提问来源于stack exchange,提问作者emre ayyildiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:15:19