本指南详细阐述了在SQL Server中将两个表高效合并为一个表的多种策略,内容涵盖了使用UNION ALL进行数据追加、JOIN进行关联查询以及MERGE语句实现数据同步的核心技术,重点分析了不同场景下的性能优化技巧,包括索引维护、数据类型匹配及重复数据处理,旨在帮助数据库管理员和开发者提升数据整合效率,确保数据一致性与准确性。
在数据库管理与开发过程中,我们经常面临需要将分散在不同表中的数据整合到一起的情况,无论是因为数据迁移、报表生成,还是为了优化数据结构,掌握在 SQL Server 中将两个表合并为一个表的技巧都是一项必备技能。
根据数据结构和业务需求的不同,“合并”通常有两种含义:一种是“纵向追加”(将一个表的数据接到另一个表下面),另一种是“横向连接”(根据关联字段将两个表的列拼在一起),本文将详细介绍这两种场景的具体实现方法。
纵向合并(追加数据)
这种场景适用于两个表结构相同或非常相似的情况,目的是将表 B 的数据全部添加到表 A 中,或者生成一个包含两者所有行的新表。

使用 UNION ALL 创建新表
如果你不想修改原表,而是想生成一个包含两个表所有数据的新表,可以使用 SELECT INTO 配合 UNION ALL。
-- 将 TableA 和 TableB 的数据合并到新表 NewTable 中 -- UNION ALL 会保留所有行,包括重复的行,性能优于 UNION SELECT * INTO NewTable FROM TableA UNION ALL SELECT * FROM TableB;
注意:使用 UNION ALL 要求两个表的列数必须相同,且对应列的数据类型必须兼容。
使用 INSERT INTO SELECT 追加到现有表
如果表 A 已经存在,你想把表 B 的数据插入进去,可以使用以下语句:
-- 将 TableB 的数据插入到 TableA 中 INSERT INTO TableA (Column1, Column2, Column3) SELECT Column1, Column2, Column3 FROM TableB;
小贴士:
- 如果数据中可能有重复的主键,建议先处理重复数据或在查询条件中过滤掉已存在的 ID。
- 如果你想在合并的同时去除完全重复的行,可以将
UNION ALL改为UNION。
横向合并(连接列)
这种场景适用于两个表之间存在关联字段(如 ID),目的是将表 B 的特定列“拼”在表 A 的右侧,形成一个更宽的表。
使用 JOIN 创建新视图或新表
这是最常见的操作,通常使用 INNER JOIN(只保留匹配的行)或 LEFT JOIN(保留左表所有行,右表无匹配则为 NULL)。
-- 将 TableB 的 Info 列合并到 TableA 中,基于 ID 关联
SELECT
A.ID,
A.Name,
B.Info,
B.Date
INTO NewWideTable
FROM TableA A
LEFT JOIN TableB B ON A.ID = B.ID;
使用 MERGE 语句进行同步更新
如果你的需求是“整合”并“同步”,即:如果表 A 中有该 ID 则更新表 A 的某些列,如果没有则插入新行,SQL Server 的 MERGE 语句是最强大的工具。
-- 以 TableB 为源,更新或插入到 TableA
MERGE INTO TableA AS Target
USING TableB AS Source
ON (Target.ID = Source.ID)
-- 当 ID 匹配时,更新 Target 表的某些列
WHEN MATCHED THEN
UPDATE SET Target.Info = Source.Info, Target.Date = Source.Date
-- 当 ID 不匹配时,从 Source 插入新行到 Target
WHEN NOT MATCHED BY TARGET THEN
INSERT (ID, Name, Info, Date)
VALUES (Source.ID, Source.Name, Source.Info, Source.Date);
-- 注意:MERGE 语句必须以分号结尾
在 SQL Server 中整合两个表,关键在于理清数据的逻辑关系:
- 想要堆叠数据量:使用
UNION ALL或INSERT INTO SELECT。 - 想要丰富字段信息:使用
JOIN或SELECT INTO。 - 想要数据同步与更新:使用
MERGE语句。
在实际操作前,建议先对原表进行备份,或者在开发环境中测试 SQL 语句,确保数据类型匹配且逻辑正确,避免造成数据丢失。
