SQL Server臨時(shí)表合并與數(shù)量匯總的實(shí)現(xiàn)方法
引言
在實(shí)際開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到這樣的需求:
不同業(yè)務(wù)邏輯在中間處理過(guò)程中,會(huì)產(chǎn)生多個(gè)結(jié)構(gòu)類似的臨時(shí)表(Temporary Table),例如兩個(gè)統(tǒng)計(jì)結(jié)果表,字段結(jié)構(gòu)相同,但數(shù)據(jù)來(lái)源不同。如果希望將這些結(jié)果進(jìn)行合并,并且按相同 id 進(jìn)行數(shù)量匯總,SQL Server 提供了多種實(shí)現(xiàn)方式。本文將系統(tǒng)介紹幾種常見(jiàn)做法,并給出適用場(chǎng)景。
1. 場(chǎng)景舉例
假設(shè)我們有兩個(gè)臨時(shí)表,分別存儲(chǔ)來(lái)自不同渠道的訂單統(tǒng)計(jì):
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);
需求:
- 將兩個(gè)臨時(shí)表合并;
- 相同
id的num相加; - 保留所有
id。
2. 方法一:UNION ALL + GROUP BY(推薦)
這是最簡(jiǎn)潔、性能較優(yōu)的方式,尤其適用于需要合并多個(gè)相同結(jié)構(gòu)表的情況。
SELECT id, SUM(num) AS total_num
FROM (
SELECT id, num FROM #tmp1
UNION ALL
SELECT id, num FROM #tmp2
) t
GROUP BY id;結(jié)果:
id | total_num 1 | 10 2 | 25 3 | 45 4 | 25
特點(diǎn)
- 簡(jiǎn)潔、易讀;
- 可擴(kuò)展性強(qiáng):如果有多個(gè)臨時(shí)表,只需繼續(xù)
UNION ALL; - 適用場(chǎng)景:表結(jié)構(gòu)完全一致。
3. 方法二:FULL OUTER JOIN
如果你需要清晰地看到來(lái)自不同表的數(shù)據(jù)來(lái)源,或者兩個(gè)表字段不完全一致,可以使用 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;結(jié)果與方法一相同:
id | total_num 1 | 10 2 | 25 3 | 45 4 | 25
特點(diǎn)
- 可以保留兩個(gè)表的來(lái)源數(shù)據(jù);
- 寫(xiě)法比
UNION ALL冗長(zhǎng); - 適用場(chǎng)景:當(dāng)需要對(duì)不同表進(jìn)行逐字段對(duì)齊處理時(shí)更合適。
4. 方法三:合并多個(gè)臨時(shí)表(通用模板)
在實(shí)際項(xiàng)目中,我們可能會(huì)有三個(gè)以上的臨時(shí)表,例如 #tmp1、#tmp2、#tmp3。
此時(shí)推薦使用 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;這種方式可以輕松擴(kuò)展到 N 個(gè)臨時(shí)表。
5. 性能對(duì)比與優(yōu)化建議
UNION ALL + GROUP BY:
- 更適合大數(shù)據(jù)量合并,SQL Server 優(yōu)化器對(duì)這種模式有較好支持。
- 如果合并的表數(shù)量多,可以考慮將其放入臨時(shí)表再做聚合。
FULL OUTER JOIN:
- 更直觀,但如果表數(shù)量超過(guò) 2 個(gè),寫(xiě)法復(fù)雜度會(huì)急劇上升。
- 性能上通常比
UNION ALL差。
建議:如果只是簡(jiǎn)單數(shù)量合并,盡量使用 UNION ALL + GROUP BY。
如果需要保留不同來(lái)源表的明細(xì)差異,可以使用 FULL OUTER JOIN。
6. 總結(jié)
在 SQL Server 中合并兩個(gè)或多個(gè)臨時(shí)表并對(duì)相同 id 進(jìn)行數(shù)量匯總,有兩種主要思路:
- UNION ALL + GROUP BY:簡(jiǎn)潔高效,適合多表合并,推薦使用。
- FULL OUTER JOIN:邏輯清晰,適合兩個(gè)表逐字段對(duì)齊場(chǎng)景。
在實(shí)際業(yè)務(wù)開(kāi)發(fā)中,應(yīng)根據(jù)臨時(shí)表數(shù)量和需求靈活選擇方案。對(duì)于多來(lái)源的統(tǒng)計(jì)計(jì)算,建議統(tǒng)一采用 UNION ALL + GROUP BY,既保證了性能,也便于擴(kuò)展。
以上就是SQL Server臨時(shí)表合并與數(shù)量匯總的實(shí)現(xiàn)方法的詳細(xì)內(nèi)容,更多關(guān)于SQL Server臨時(shí)表合并與數(shù)量匯總的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Sql Server的一些知識(shí)點(diǎn)定義總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于Sql Server的一些知識(shí)點(diǎn)定義文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
親自教你使用?ChatGPT?編寫(xiě)?SQL?JOIN?查詢示例
這篇文章主要介紹了使用ChatGPT編寫(xiě)SQL?JOIN查詢,作為一種語(yǔ)言模型,ChatGPT 可以就如何構(gòu)建復(fù)雜的 SQL 查詢和 JOIN 提供指導(dǎo)和建議,但它不能直接訪問(wèn) SQL 數(shù)據(jù)庫(kù),它可以幫助您了解語(yǔ)法、最佳實(shí)踐和有關(guān)如何構(gòu)建查詢以高效執(zhí)行的一般指導(dǎo),需要的朋友可以參考下2023-02-02
SQL?Server設(shè)置多個(gè)端口號(hào)的操作步驟
SQL?Server使用的默認(rèn)端口號(hào)是TCP端口1433,這是為了連接到?Microsoft?SQL?Server?實(shí)例的標(biāo)準(zhǔn)網(wǎng)絡(luò)端口,如果你正在設(shè)置?SQL?Server?或者嘗試從其他應(yīng)用程序連接到它,所以本文給大家介紹了SQL?Server如何設(shè)置多個(gè)端口號(hào),需要的朋友可以參考下2024-07-07
深入學(xué)習(xí)SQL Server聚合函數(shù)算法優(yōu)化技巧
這篇文章主要深入學(xué)習(xí)SQL Server聚合函數(shù)算法優(yōu)化技巧,感興趣的小伙伴們可以參考一下2015-12-12
SQLServer中生成雪花ID(Snowflake?ID)的實(shí)現(xiàn)方法
這篇文章主要介紹了在SQL?Server中生成雪花ID(Snowflake?ID)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08
SQL Server 數(shù)據(jù)庫(kù)優(yōu)化
設(shè)計(jì)1個(gè)應(yīng)用系統(tǒng)似乎并不難,但是要想使系統(tǒng)達(dá)到最優(yōu)化的性能并不是一件容易的事。2009-07-07
SQL?Server數(shù)據(jù)庫(kù)中已存在名為'student'對(duì)象的解決辦法
這篇文章主要給大家介紹了關(guān)于SQL?Server數(shù)據(jù)庫(kù)中已存在名為'student'對(duì)象的解決辦法,解決方法很簡(jiǎn)單,并且也很實(shí)用,不止有這一個(gè)用處,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
用SQL語(yǔ)句實(shí)現(xiàn)隨機(jī)查詢數(shù)據(jù)并不顯示錯(cuò)誤數(shù)據(jù)的方法
用SQL語(yǔ)句實(shí)現(xiàn)隨機(jī)查詢數(shù)據(jù)并不顯示錯(cuò)誤數(shù)據(jù)的方法...2007-11-11
SqlServer 英文單詞全字匹配詳解及實(shí)現(xiàn)代碼
這篇文章主要介紹了SqlServer 英文單詞全字匹配的相關(guān)資料,并附實(shí)例,有需要的小伙伴可以參考下2016-09-09

