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

SQL查询中SUM与COUNT错误相乘问题的修复方法咨询

SQL查询问题修复方案

问题原因

当同时左连接dictionary_ratings和terms两张表时,会产生笛卡尔积:每个评分记录会与该字典下的所有词条记录配对,导致评分总和被重复计算,重复次数等于该字典的词条数量,最终得到错误的放大值。

修复方法

方法一:先聚合子表再连接主表

先分别对评分表和词条表按字典ID聚合,得到每个字典的独立评分总和与词条数,再关联主表,彻底避免笛卡尔积:

SELECT 
    d.title,
    COALESCE(r.total_rating, 0) AS rating_count,
    COALESCE(t.total_terms, 0) AS term_count
FROM dictionaries d
LEFT JOIN (
    SELECT dictionary_id, SUM(rating) AS total_rating
    FROM dictionary_ratings
    GROUP BY dictionary_id
) r ON d.id = r.dictionary_id
LEFT JOIN (
    SELECT dictionary_id, COUNT(id) AS total_terms
    FROM terms
    GROUP BY dictionary_id
) t ON d.id = t.dictionary_id
ORDER BY d.created_at DESC
  • COALESCE用于处理无评分/词条的字典,返回0而非NULL,保证结果一致性。

方法二:使用窗口函数(适用于支持窗口函数的数据库)

通过窗口函数按字典ID分区计算聚合值,再去重得到唯一结果:

SELECT 
    DISTINCT d.title,
    COALESCE(SUM(r.rating) OVER (PARTITION BY d.id), 0) AS rating_count,
    COALESCE(COUNT(t.id) OVER (PARTITION BY d.id), 0) AS term_count
FROM dictionaries d
LEFT JOIN dictionary_ratings r ON d.id = r.dictionary_id
LEFT JOIN terms t ON d.id = t.dictionary_id
ORDER BY d.created_at DESC
  • PARTITION BY d.id确保每个字典的聚合计算独立进行,DISTINCT去除连接产生的重复行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:05:19