莔月 發表於 2025-8-31 15:50:50

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">引言</a></li><li><a href="#_label1">1. 场景举例</a></li><li><a href="#_label2">2. 方法一:UNION ALL + GROUP BY(推荐)</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_0">特点</a></li></ul><li><a href="#_label3">3. 方法二:FULL OUTER JOIN</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_1">特点</a></li></ul><li><a href="#_label4">4. 方法三:合并多个临时表(通用模板)</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">5. 性能对比与优化建议</a></li><ul class="second_class_ul"></ul><li><a href="#_label6">6. 总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>引言</h2>
<p>在实际开发中,我们经常会遇到这样的需求:<br />不同业务逻辑在中间处理过程中,会产生多个结构类似的临时表(Temporary Table),例如两个统计结果表,字段结构相同,但数据来源不同。如果希望将这些结果进行合并,并且按相同 <code>id</code> 进行数量汇总,SQL Server 提供了多种实现方式。本文将系统介绍几种常见做法,并给出适用场景。</p>
<p class="maodian"><a name="_label1"></a></p><h2>1. 场景举例</h2>
<p>假设我们有两个临时表,分别存储来自不同渠道的订单统计:</p>
<div class="jb51code"><pre class="brush:sql;">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);</pre></div>
<p>需求:</p>
<ul><li>将两个临时表合并;</li><li>相同 <code>id</code> 的 <code>num</code> 相加;</li><li>保留所有 <code>id</code>。</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>2. 方法一:UNION ALL + GROUP BY(推荐)</h2>
<p>这是最简洁、性能较优的方式,尤其适用于需要合并多个相同结构表的情况。</p>
<div class="jb51code"><pre class="brush:sql;">SELECT id, SUM(num) AS total_num
FROM (
    SELECT id, num FROM #tmp1
    UNION ALL
    SELECT id, num FROM #tmp2
) t
GROUP BY id;</pre></div>
<p>结果:</p>
<div class="jb51code"><pre class="brush:sql;">id | total_num
1| 10
2| 25
3| 45
4| 25</pre></div>
<p class="maodian"><a name="_lab2_2_0"></a></p><p class="maodian"><a name="_lab2_3_1"></a></p><h3>特点</h3>
<ul><li>简洁、易读;</li><li>可扩展性强:如果有多个临时表,只需继续 <code>UNION ALL</code>;</li><li><strong>适用场景</strong>:表结构完全一致。</li></ul>
<p class="maodian"><a name="_label3"></a></p><h2>3. 方法二:FULL OUTER JOIN</h2>
<p>如果你需要清晰地看到来自不同表的数据来源,或者两个表字段不完全一致,可以使用 <code>FULL OUTER JOIN</code>。</p>
<div class="jb51code"><pre class="brush:sql;">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;</pre></div>
<p>结果与方法一相同:</p>
<div class="jb51code"><pre class="brush:sql;">id | total_num
1| 10
2| 25
3| 45
4| 25</pre></div>
<h3>特点</h3>
<ul><li>可以保留两个表的来源数据;</li><li>写法比 <code>UNION ALL</code> 冗长;</li><li><strong>适用场景</strong>:当需要对不同表进行逐字段对齐处理时更合适。</li></ul>
<p class="maodian"><a name="_label4"></a></p><h2>4. 方法三:合并多个临时表(通用模板)</h2>
<p>在实际项目中,我们可能会有三个以上的临时表,例如 <code>#tmp1</code>、<code>#tmp2</code>、<code>#tmp3</code>。<br />此时推荐使用 <strong>UNION ALL + GROUP BY</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">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;</pre></div>
<p>这种方式可以轻松扩展到 N 个临时表。</p>
<p class="maodian"><a name="_label5"></a></p><h2>5. 性能对比与优化建议</h2>
<p><strong>UNION ALL + GROUP BY</strong>:</p>
<ul><li>更适合大数据量合并,SQL Server 优化器对这种模式有较好支持。</li><li>如果合并的表数量多,可以考虑将其放入临时表再做聚合。</li></ul>
<p><strong>FULL OUTER JOIN</strong>:</p>
<ul><li>更直观,但如果表数量超过 2 个,写法复杂度会急剧上升。</li><li>性能上通常比 <code>UNION ALL</code> 差。</li></ul>
<blockquote><p><strong>建议</strong>:如果只是简单数量合并,尽量使用 <strong>UNION ALL + GROUP BY</strong>。<br />如果需要保留不同来源表的明细差异,可以使用 <strong>FULL OUTER JOIN</strong>。</p></blockquote>
<p class="maodian"><a name="_label6"></a></p><h2>6. 总结</h2>
<p>在 SQL Server 中合并两个或多个临时表并对相同 <code>id</code> 进行数量汇总,有两种主要思路:</p>
<ul><li><strong>UNION ALL + GROUP BY</strong>:简洁高效,适合多表合并,推荐使用。</li><li><strong>FULL OUTER JOIN</strong>:逻辑清晰,适合两个表逐字段对齐场景。</li></ul>
<p>在实际业务开发中,应根据临时表数量和需求灵活选择方案。对于多来源的统计计算,建议统一采用 <code>UNION ALL + GROUP BY</code>,既保证了性能,也便于扩展。</p>
<p>以上就是SQL Server临时表合并与数量汇总的实现方法的详细内容,更多关于SQL Server临时表合并与数量汇总的资料请关注琼殿技术社区其它相关文章!</p>
頁: [1]
查看完整版本: SQL Server临时表合并与数量汇总的实现方法