如何在SQL Server中合并具有不同列标题的表以映射到公共描述?

问题描述 投票:1回答:1

我有多个表要合并到一个表中。这些表表示相同的数据,但具有不同的列标题,因为它们来自多个来源。例如,在表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
sql sql-server tsql merge dynamic-sql
1个回答
0
投票

正如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

Demo on DB Fiddle

© www.soinside.com 2019 - 2024. All rights reserved.