如何通过UNION ALL将两张表合并到临时表中?
合并两张表到临时表的正确写法
你之前的两种尝试都存在语法问题,以下是问题分析和正确解决方案:
第一种尝试的问题
SELECT * INTO #temp FROM Customers.Emails UNION ALL SELECT * INTO #temp FROM Customers.Location
SELECT INTO 语句会直接创建目标表,你在 UNION ALL 的两个分支都写了 SELECT INTO #temp,相当于尝试两次创建同一个临时表,执行时会报「数据库中已存在名为'#temp'的对象」的错误。
第二种尝试的问题
你写的语句缺少关键的 FROM 关键字,同时子查询必须指定别名,这就是触发 Must specify table to select from 和字段相关错误的原因。
正确写法
情况1:两张表结构完全一致(列数、顺序、数据类型完全匹配)
如果 Customers.Emails 和 Customers.Location 的列结构完全相同,可以用子查询包裹联合查询,再通过 SELECT INTO 创建临时表:
SELECT * INTO #temp FROM ( SELECT * FROM Customers.Emails UNION ALL -- 若需要去重,替换为 UNION SELECT * FROM Customers.Location ) AS CombinedResult -- 必须给子查询指定别名
情况2:两张表结构不同
如果两张表的列数、列名或数据类型不一致,需要明确指定要选择的列,并通过别名保证列名统一:
SELECT CustomerID, ContactType, ContactValue INTO #temp FROM ( SELECT CustomerID, 'Email' AS ContactType, Email AS ContactValue FROM Customers.Emails UNION ALL SELECT CustomerID, 'Location' AS ContactType, Address AS ContactValue FROM Customers.Location ) AS CombinedResult
这里手动指定了统一的列名,确保临时表的列结构合法,同时通过 ContactType 区分数据来源表。
内容的提问来源于stack exchange,提问作者Kaloxu
相关产品推荐
相关产品推荐

