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
相关产品推荐
相关产品推荐

