我有多个表要合并到一个表中。这些表表示相同的数据,但具有不同的列标题,因为它们来自多个来源。例如,在表1中,我们将具有“ Tel_Nbr”,在表2中将具有“ TelNumber”,在表3中将具有“ TelNum”等。为了使可重命名性更好,我想我可以创建一个映射表,而不是重命名每个表中的列从每个表到最终输出表中公共描述的每个列标题名称,如下所示。但是,我不确定这是最好的方法,因为我在映射表中使用表名,并且无法弄清楚查询语法。
表1
First_Name | Last_Name | Telephone_Number
-----------------------------------------
John | Smith | 3333
Michael | Taylor | 4444
Table2
F_Name | L_Name | Tel_Nbr
--------------------------------
Joe | Lopez | 5555
Rachel | Moore | 6666
映射表
Output | Table1 | Table2
----------------------------------------
FirstName | First_Name | F_Name
LastName | Last_Name | L_Name
TelephoneNbr | Telephone_Number | Tel_Nbr
输出
FirstName | LastName | TelephoneNbr
-----------------------------------------
John | Smith | 3333
Michael | Taylor | 4444
Joe | Lopez | 5555
Rachel | Moore | 6666
正如Gordon Linoff指出的那样,您要求的内容需要动态SQL。也就是说,从mapping_table
的内容构建查询字符串,然后执行它。
考虑:
declare
@q1 nvarchar(max),
@q2 nvarchar(max),
@q nvarchar(max)
;
select
@q1 = string_agg(table1 + ' as ' + output, ', ') within group(order by output),
@q2 = string_agg(table2, ', ') within group(order by output)
from mapping_table;
set @q = 'select ' + @q1 + N' from table1 union all select ' + @q2 + ' from table2'
--debug
select @q;
-- execute
EXEC sp_executesql @q;
对于您的示例数据,生成的查询为(我添加了换行符和缩进以提高可读性:]
select First_Name as FirstName, Last_Name as LastName, Telephone_Number as TelephoneNbr
from table1
union all
select F_Name, L_Name, Tel_Nbr from table2