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

如何高效汇总两张表中同FirstName的Occures总和?求更优方案

高效实现两表相同FirstName的Occures汇总方案

我明白你现在的需求:不想用临时表或者CTE,直接通过表关联来完成两个大表的FirstName分组求和,而且要利用已有的索引提升性能。这里给你一个完美的解决方案,用FULL OUTER JOIN就能一步搞定,完全符合你的要求:

核心查询代码

create table #foo(FirstName varchar(500), Occures int)
create table #bar(FirstName varchar(500), Occures int)

insert into #foo values('a', 1)
insert into #foo values('b', 2)
insert into #foo values('c', 3)
insert into #foo values('d', 4)
insert into #bar values('c', 1)
insert into #bar values('d', 2)
insert into #bar values('g', 3)
insert into #bar values('h', 4);

-- 关键的关联求和逻辑
SELECT
    COALESCE(f.FirstName, b.FirstName) AS FirstName,
    SUM(ISNULL(f.Occures, 0) + ISNULL(b.Occures, 0)) AS Occures
FROM #foo f
FULL OUTER JOIN #bar b 
    ON f.FirstName = b.FirstName
GROUP BY COALESCE(f.FirstName, b.FirstName)

drop table #foo
drop table #bar

为什么这个方案更好?

  • 无中间开销:不需要创建临时表或者插入大量数据,直接在原表上进行关联计算,省掉了临时表的IO和存储成本
  • 索引友好:因为你已经在两个表的FirstName字段上建了索引,FULL OUTER JOIN的关联条件会直接利用这些索引,关联效率比Union后再分组(需要排序合并)高很多,尤其适合数据量大的场景
  • 逻辑简洁:一步完成所有FirstName的汇总,不管这个名字只在#foo、只在#bar还是两个表都存在,都能正确计算总和

补充说明

这里用COALESCE是为了统一获取存在的FirstName(比如某个名字只在#bar里,那#foo对应的字段就是null,COALESCE会取#bar的FirstName);ISNULL是为了把null的Occures转成0,避免求和时出现null值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:31:13