如何合并 SQL Server 中具有映射到通用描述的不同列标题的表?

Posted

技术标签:

【中文标题】如何合并 SQL Server 中具有映射到通用描述的不同列标题的表?【英文标题】:How to merge tables in SQL server that have a different column headers that map to a common description? 【发布时间】:2020-04-20 22:02:43 【问题描述】:

我有多个表要合并到一个表中。这些表代表相同的数据,但具有不同的列标题,因为它们来自多个来源。例如,在 Table1 中,我们将有“Tel_Nbr”,在 Table2 中为“TelNumber”,在 Table3 中为“TelNum”等。为了更好的可维护性,我想我可以创建一个映射表,而不是重命名每个表中的列每个表的每个列标题名称到最终输出表中的通用描述如下所示。但是,我不确定这是最好的方法,因为我使用的是映射表中的表名,而且我无法弄清楚查询语法。

表1

First_Name | Last_Name | Telephone_Number
-----------------------------------------
John       | Smith     | 3333
Michael    | Taylor    | 4444

表2

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。 【参考方案1】:

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

【讨论】:

以上是关于如何合并 SQL Server 中具有映射到通用描述的不同列标题的表?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MS SQL Server 2005,如何将详细记录合并到一个逗号分隔的列表中

具有排列数组的通用合并排序

如何将数字范围映射到 SQL Server 或 Clickhouse 中的数字

如何将 MS SQL Server 数据库合并到 MySQL 数据库?

SQL Server UNION ALL 合并连接(连接)太慢

如何使用 SQL Server 2005 在 NHibernate 中映射 uint