如何高效汇总两张表中同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
相关产品推荐
相关产品推荐

