如何在单个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;
这两种方法都能得到你期望的结果:
| EMPLOYEE | CITY | AMOUNT |
|---|---|---|
| John | LA | 1500 |
| Bob | NYC | 3100 |
| Phill | LA | 4000 |
内容的提问来源于stack exchange,提问作者Anis Fendi
相关产品推荐
相关产品推荐

