SQL Server临时表合并与数量汇总的实现方法

 更新时间:2025年08月31日 15:50:50   作者:nbsaas-boot  
不同业务逻辑在中间处理过程中,会产生多个结构类似的临时表,如果希望将这些结果进行合并,并且按相同 id 进行数量汇总,SQL Server 提供了多种实现方式,本文将系统介绍几种常见做法,并给出适用场景,需要的朋友可以参考下

引言

在实际开发中,我们经常会遇到这样的需求:
不同业务逻辑在中间处理过程中,会产生多个结构类似的临时表(Temporary Table),例如两个统计结果表,字段结构相同,但数据来源不同。如果希望将这些结果进行合并,并且按相同 id 进行数量汇总,SQL Server 提供了多种实现方式。本文将系统介绍几种常见做法,并给出适用场景。

1. 场景举例

假设我们有两个临时表,分别存储来自不同渠道的订单统计:

CREATE TABLE #tmp1 (id INT, num INT);
CREATE TABLE #tmp2 (id INT, num INT);
 
INSERT INTO #tmp1 VALUES (1, 10), (2, 20), (3, 30);
INSERT INTO #tmp2 VALUES (2, 5), (3, 15), (4, 25);

需求:

  • 将两个临时表合并;
  • 相同 idnum 相加;
  • 保留所有 id

2. 方法一:UNION ALL + GROUP BY(推荐)

这是最简洁、性能较优的方式,尤其适用于需要合并多个相同结构表的情况。

SELECT id, SUM(num) AS total_num
FROM (
    SELECT id, num FROM #tmp1
    UNION ALL
    SELECT id, num FROM #tmp2
) t
GROUP BY id;

结果:

id | total_num
1  | 10
2  | 25
3  | 45
4  | 25

特点

  • 简洁、易读;
  • 可扩展性强:如果有多个临时表,只需继续 UNION ALL
  • 适用场景:表结构完全一致。

3. 方法二:FULL OUTER JOIN

如果你需要清晰地看到来自不同表的数据来源,或者两个表字段不完全一致,可以使用 FULL OUTER JOIN

SELECT 
    COALESCE(t1.id, t2.id) AS id,
    ISNULL(t1.num, 0) + ISNULL(t2.num, 0) AS total_num
FROM #tmp1 t1
FULL OUTER JOIN #tmp2 t2
    ON t1.id = t2.id;

结果与方法一相同:

id | total_num
1  | 10
2  | 25
3  | 45
4  | 25

特点

  • 可以保留两个表的来源数据;
  • 写法比 UNION ALL 冗长;
  • 适用场景:当需要对不同表进行逐字段对齐处理时更合适。

4. 方法三:合并多个临时表(通用模板)

在实际项目中,我们可能会有三个以上的临时表,例如 #tmp1#tmp2#tmp3
此时推荐使用 UNION ALL + GROUP BY

SELECT id, SUM(num) AS total_num
FROM (
    SELECT id, num FROM #tmp1
    UNION ALL
    SELECT id, num FROM #tmp2
    UNION ALL
    SELECT id, num FROM #tmp3
) t
GROUP BY id;

这种方式可以轻松扩展到 N 个临时表。

5. 性能对比与优化建议

UNION ALL + GROUP BY

  • 更适合大数据量合并,SQL Server 优化器对这种模式有较好支持。
  • 如果合并的表数量多,可以考虑将其放入临时表再做聚合。

FULL OUTER JOIN

  • 更直观,但如果表数量超过 2 个,写法复杂度会急剧上升。
  • 性能上通常比 UNION ALL 差。

建议:如果只是简单数量合并,尽量使用 UNION ALL + GROUP BY
如果需要保留不同来源表的明细差异,可以使用 FULL OUTER JOIN

6. 总结

在 SQL Server 中合并两个或多个临时表并对相同 id 进行数量汇总,有两种主要思路:

  • UNION ALL + GROUP BY:简洁高效,适合多表合并,推荐使用。
  • FULL OUTER JOIN:逻辑清晰,适合两个表逐字段对齐场景。

在实际业务开发中,应根据临时表数量和需求灵活选择方案。对于多来源的统计计算,建议统一采用 UNION ALL + GROUP BY,既保证了性能,也便于扩展。

以上就是SQL Server临时表合并与数量汇总的实现方法的详细内容,更多关于SQL Server临时表合并与数量汇总的资料请关注脚本之家其它相关文章!

相关文章

  • Sql Server的一些知识点定义总结

    Sql Server的一些知识点定义总结

    这篇文章主要给大家总结介绍了关于Sql Server的一些知识点定义文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • 亲自教你使用 ChatGPT 编写 SQL JOIN 查询示例

    亲自教你使用 ChatGPT 编写 SQL JOIN 查询示例

    这篇文章主要介绍了使用ChatGPT编写SQL JOIN查询,作为一种语言模型,ChatGPT 可以就如何构建复杂的 SQL 查询和 JOIN 提供指导和建议,但它不能直接访问 SQL 数据库,它可以帮助您了解语法、最佳实践和有关如何构建查询以高效执行的一般指导,需要的朋友可以参考下
    2023-02-02
  • SQL Server设置多个端口号的操作步骤

    SQL Server设置多个端口号的操作步骤

    SQL Server使用的默认端口号是TCP端口1433,这是为了连接到 Microsoft SQL Server 实例的标准网络端口,如果你正在设置 SQL Server 或者尝试从其他应用程序连接到它,所以本文给大家介绍了SQL Server如何设置多个端口号,需要的朋友可以参考下
    2024-07-07
  • 深入学习SQL Server聚合函数算法优化技巧

    深入学习SQL Server聚合函数算法优化技巧

    这篇文章主要深入学习SQL Server聚合函数算法优化技巧,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • SQLServer中生成雪花ID(Snowflake ID)的实现方法

    SQLServer中生成雪花ID(Snowflake ID)的实现方法

    这篇文章主要介绍了在SQL Server中生成雪花ID(Snowflake ID)的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • SQL Server 数据库优化

    SQL Server 数据库优化

    设计1个应用系统似乎并不难,但是要想使系统达到最优化的性能并不是一件容易的事。
    2009-07-07
  • SQL 将一列拆分成多列的实现示例

    SQL 将一列拆分成多列的实现示例

    在SQL中,有时需要将一列数据按照特定的符号进行分割,分成多个列,本文就来介绍一下SQL 将一列拆分成多列的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • SQL Server数据库中已存在名为'student'对象的解决办法

    SQL Server数据库中已存在名为'student'对象的解决办法

    这篇文章主要给大家介绍了关于SQL Server数据库中已存在名为'student'对象的解决办法,解决方法很简单,并且也很实用,不止有这一个用处,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • 用SQL语句实现随机查询数据并不显示错误数据的方法

    用SQL语句实现随机查询数据并不显示错误数据的方法

    用SQL语句实现随机查询数据并不显示错误数据的方法...
    2007-11-11
  • SqlServer 英文单词全字匹配详解及实现代码

    SqlServer 英文单词全字匹配详解及实现代码

    这篇文章主要介绍了SqlServer 英文单词全字匹配的相关资料,并附实例,有需要的小伙伴可以参考下
    2016-09-09

最新评论