Как объединить таблицы на сервере SQL с разными заголовками столбцов, которые соответствуют общему описанию? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть несколько таблиц, которые я хочу объединить в одну таблицу. Таблицы представляют одни и те же данные, но имеют разные заголовки столбцов, поскольку они получены из нескольких источников. Например, в Таблице 1 у нас будет «Tel_Nbr», в Таблице 2 «TelNumber» и в Таблице 3 «TelNum» и т. Д. c. Вместо того, чтобы переименовывать столбцы в каждой таблице и для лучшей управляемости, я подумал, что мог бы создать таблицу сопоставления. где я сопоставляю имя заголовка каждого столбца из каждой таблицы с общим описанием в итоговой выходной таблице, как показано ниже. Однако я не совсем уверен, что это лучший подход, потому что я использую имена таблиц в таблице сопоставлений и не могу понять синтаксис запроса.

Table1

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

Mapping_Table

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

1 Ответ

1 голос
/ 21 апреля 2020

Как указывает Гордон Линофф, то, что вы просите, требует динамичности c 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

Демонстрация на DB Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...