当前位置: 首页 > news >正文

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 #tmp1UNION ALLSELECT 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 t2ON 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 #tmp1UNION ALLSELECT id, num FROM #tmp2UNION ALLSELECT 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,既保证了性能,也便于扩展。


http://www.dtcms.com/a/359023.html

相关文章:

  • 大模型不听话?试试提示词微调
  • “可选功能“中找不到 OpenSSH, PowerShell 命令行来安装OpenSSH
  • windows 谷歌浏览器一直提示无法更新Chrome弹窗问题彻底解决
  • Learning Curve|学习曲线
  • 数据库攻略:“CMU 15-445”Project0:C++ Primer(2024 Fall)
  • 【开题答辩全过程】以 “与我同行”中华传统历史数字化平台的设计和分析-------为例,包含答辩的问题和答案
  • Linux软件定时器回顾
  • 本地部署开源媒体服务器 Komga 并实现外部访问( Windows 版本)
  • 容器存储驱动升级:美国VPS文件系统优化全指南
  • 上海我店模式的多维度探究
  • 对于STM32工程模板
  • CRM、ERP、HRP系统有啥区别?
  • 250830-Docker从Rootless到Rootful的Gitlab镜像迁移
  • 深刻理解软硬件链接
  • ubuntu24.04 qt6安装
  • 学习游戏制作记录(各种优化)
  • 复制VMware虚拟机后的网络配置
  • leetcode算法刷题的第二十二天
  • 论《运动战》
  • Linux查看有线网卡和无线网卡详解
  • UNet改进(36):融合FSATFusion的医学图像分割
  • Vue基础知识-单向绑定v-bind、双向绑定v-model、插值语法{{}}、Object.defineProperty实现数据代理
  • PostgreSQL数据类型一览(数值类型)
  • Spring和mybatis整合后事务拦截器TransactionInterceptor开启提交事务流程
  • 【Java实战⑧】Java常用类实战:解锁String、Object与包装类的奥秘
  • STL中的容器,迭代器
  • 规律作息 + 养成好的习惯 + 考研倒计时 111 天 + 线面积分入门 1 下半部分
  • 【路由器】TP Link 路由器为何无法进入管理后台
  • HarmonyOS AppStorage:跨组件状态管理的高效解决方案
  • 2025年06月 Scratch 图形化(二级)真题解析#中国电子学会#全国青少年软件编程等级考试