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

SQL同列值求和:去除CROSS JOIN查询重复结果的方法

解决CROSS JOIN求和时的重复结果问题

嘿,我看你在用CROSS JOIN实现同一年份不同key的value求和时,遇到了结果重复的问题——这其实是因为你的条件t1.key <> t2.key会生成双向配对:比如sam和Jam配对一次,Jam和sam又配对一次,这两次计算出来的total完全一样,所以结果里就出现了重复行。

问题原因拆解

拿2013年的数据举例:

  • 当t1.key='sam'且t2.key='Jam'时,计算出30+0=30
  • 当t1.key='Jam'且t2.key='sam'时,又会计算出0+30=30
    这两行结果完全重复,其他年份也是同样的道理,所以你的结果集里每个total都出现了两次。

解决方案

有两种常用的方法可以解决这个问题,优先推荐第一种(性能更优):

方法1:过滤单向配对,从源头避免重复

把条件t1.key <> t2.key改成t1.key < t2.key,这样每个配对只会保留一次(比如只保留sam在前、Jam在后的情况,不会反过来),直接从源头上减少重复行:

SELECT (t1.value + t2.value) AS total 
FROM table t1 
CROSS JOIN table t2 
WHERE t1.year = t2.year AND t1.key < t2.key;

方法2:用DISTINCT去重(适合快速临时处理)

如果不想修改配对逻辑,可以在SELECT后面加上DISTINCT关键字,让数据库自动去掉重复的total值:

SELECT DISTINCT (t1.value + t2.value) AS total 
FROM table t1 
CROSS JOIN table t2 
WHERE t1.year = t2.year AND t1.key <> t2.key;

不过这种方法是先生成所有重复行再去重,当数据量较大时,性能不如第一种方法。

验证结果

不管用哪种方法,最终都会得到你期望的无重复结果:

|total|
|-----|
|30|
|60|
|70|
|110|

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:06:04