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

如何在单个SELECT查询中关联含SUM函数的两张表获取正确结果?

解决方法:关联聚合表与地址表的正确SQL查询

我来帮你搞定这个问题!你之前遇到的错误主要有两个原因:一是用了没有连接条件的隐式交叉连接(逗号分隔两张表),导致生成了笛卡尔积(所有行两两匹配),二是分组逻辑没有结合正确的关联方式,最终得到了错误的结果。

为什么你的尝试出问题了?

当你写FROM SALARY S, ADDRESS A却没加连接条件时,数据库会把SALARY的每一行和ADDRESS的每一行都关联起来——比如John的薪资记录会同时和Bob、Phill的地址记录匹配,这就导致聚合时计算了错误的总和,还出现了不存在的员工-地址组合(比如John-NYC)。

两种正确的解决方案

方案1:先聚合薪资,再关联地址表(推荐,性能更优)

先对SALARY表按员工分组计算总薪资,得到每个员工的薪资总和,再用这个结果和ADDRESS表通过员工姓名关联。这种方式先减少了数据量,再做连接,效率更高:

SELECT 
    agg_salary.EMPLOYEE,
    address.CITY,
    agg_salary.TOTAL_AMOUNT AS AMOUNT
FROM (
    -- 子查询先计算每个员工的薪资总和
    SELECT 
        EMPLOYEE,
        SUM(AMOUNT) AS TOTAL_AMOUNT
    FROM SALARY
    GROUP BY EMPLOYEE
) agg_salary
-- 用显式JOIN关联地址表,指定连接条件
JOIN ADDRESS address 
    ON agg_salary.EMPLOYEE = address.EMPLOYEE;

方案2:先关联表,再聚合(更简洁)

如果每个员工在ADDRESS表中只有一条记录(从你的示例数据看是这样),可以先通过员工姓名关联两张表,再按员工和城市分组聚合。这里一定要用显式的JOIN并指定连接条件,避免笛卡尔积:

SELECT 
    s.EMPLOYEE,
    a.CITY,
    SUM(s.AMOUNT) AS AMOUNT
FROM SALARY s
JOIN ADDRESS a 
    ON s.EMPLOYEE = a.EMPLOYEE
GROUP BY s.EMPLOYEE, a.CITY;

这两种方法都能得到你期望的结果:

EMPLOYEECITYAMOUNT
JohnLA1500
BobNYC3100
PhillLA4000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:17:29