You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中合并两个查询结果:能否不使用UNION运算符?

在SQL Server中合并两个查询结果集的方法(含非UNION方案)

嗨,我来帮你梳理下在SQL Server里合并两个查询结果集的具体方法,包括不用UNION运算符的实现方案~

一、最常用的方案:UNION / UNION ALL

这是合并结果集的标准做法,两种写法各有适用场景:

  • UNION:会自动剔除合并结果里的重复行,并且会对结果集做排序,性能相对弱一些,适合需要去重的场景。
  • UNION ALL:直接把两个结果集拼接在一起,不去重也不排序,性能更高。如果你能确定两个结果集没有重复数据,或者不需要去重,优先用这个。

举个实际例子:假设你要合并Customers表的美国客户和Leads表的美国潜在客户的姓名与邮箱:

-- 用UNION ALL(无去重,性能更优)
SELECT Name, Email FROM Customers WHERE Country = 'USA'
UNION ALL
SELECT Name, Email FROM Leads WHERE Country = 'USA';

-- 用UNION(自动去重)
SELECT Name, Email FROM Customers WHERE Country = 'USA'
UNION
SELECT Name, Email FROM Leads WHERE Country = 'USA';

⚠️ 注意:两个查询返回的列数必须完全一致,对应列的数据类型要兼容(SQL Server能完成隐式转换即可,不必完全相同)。

二、不使用UNION的合并方法

如果不想用UNION运算符,也可以通过“先存储再查询”的思路实现,适合需要对合并后的数据做额外操作的场景:

1. 使用临时表

临时表适合数据量较大的场景,操作直观:

-- 创建临时表,结构和要合并的结果集匹配
CREATE TABLE #CombinedResults (
    Name VARCHAR(100),
    Email VARCHAR(100)
);

-- 插入第一个查询的结果
INSERT INTO #CombinedResults (Name, Email)
SELECT Name, Email FROM Customers WHERE Country = 'USA';

-- 插入第二个查询的结果
INSERT INTO #CombinedResults (Name, Email)
SELECT Name, Email FROM Leads WHERE Country = 'USA';

-- 查询合并后的最终结果
SELECT Name, Email FROM #CombinedResults;

-- 可选:手动删除临时表(会话结束后会自动销毁)
DROP TABLE #CombinedResults;

2. 使用表变量

表变量更适合数据量较小的场景,语法更简洁:

-- 声明表变量,定义结构
DECLARE @CombinedResults TABLE (
    Name VARCHAR(100),
    Email VARCHAR(100)
);

-- 分别插入两个查询的结果
INSERT INTO @CombinedResults (Name, Email)
SELECT Name, Email FROM Customers WHERE Country = 'USA';

INSERT INTO @CombinedResults (Name, Email)
SELECT Name, Email FROM Leads WHERE Country = 'USA';

-- 取出合并后的结果
SELECT Name, Email FROM @CombinedResults;

3. 使用SELECT INTO + INSERT

如果不想手动定义表结构,可以先用SELECT INTO自动创建临时表,再插入第二个结果集:

-- 用第一个查询的结果自动创建临时表
SELECT Name, Email INTO #CombinedResults
FROM Customers WHERE Country = 'USA';

-- 插入第二个查询的结果
INSERT INTO #CombinedResults (Name, Email)
SELECT Name, Email FROM Leads WHERE Country = 'USA';

-- 查询合并结果
SELECT Name, Email FROM #CombinedResults;

DROP TABLE #CombinedResults;

简单总结下:如果只是单纯合并结果集,UNION/UNION ALL是最简洁高效的选择;非UNION的方法更适合需要对合并后的数据进行多次查询、修改等后续操作的场景。

内容的提问来源于stack exchange,提问作者Ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:58:43