2016-05-13 3 views
0

У меня есть 3 таблицы, которые я хочу объединить в 2 новых. Текущая модель:Вставьте данные в несколько таблиц из 1 источника

Таблица X

Id Description A Entry 1X B Entry 2X C Entry 3X

Таблица Y

Id Description 1 1Y 2 2Y 3 3Y

И теперь есть промежуточная таблица связывая эти 2 вместе в нескольких комбинациях:

Таблица Z

IdX IdY Number1 Number2 A 1 1000 2000 A 2 300 400 A 3 790 7900 B 1 99 999 C 1 5000 500 C 3 250 2500

Что я хочу сделать, это вставить эти данные в 2 таблицы. Один из них будет промежуточным, другой - всеми комбинациями IdX и IdY (таблица «code»). Промежуточное будет содержать 2 внешних ключа, которые также объединяют PK. Один для сотрудника и один для таблицы «код»). Кроме того, эти 2 FK в этой таблице будет содержать номера таблицы Z. Пример как новых таблиц:

Таблица кода

Id Description 1 Entry 1X - 1Y 2 Entry 1X - 2Y 3 Entry 1X - 3Y

Таблица промежуточного

IdEmployee IdCode Number1 Number2 Petersen 1 1000 2000 Petersen 3 790 7900 Benjamin 1 1000 2000 Benjamin 2 300 400
Benjamin 3 790 7900

Так что я искал для этого конкретного вопроса, но не смог найти точно такую ​​же проблему. Ближе всего я нашел: How can I INSERT data into two tables simultaneously in SQL Server?

Но это около 1 старой записи, которая вставлена ​​в 2 новые таблицы с 1 записью в каждой новой таблице. То, что я делаю, это вставить новую запись в таблицу «code» для каждой комбинации X и Y, найденной в старой промежуточной таблице. Затем я хочу вставить новые записи в новую промежуточную таблицу, связывающую все новые записи в «коде» со всеми существующими записями в таблице Employee.

Что мне до сих пор:

insert into code (Id, Column1, Column2, Description) 
OUTPUT inserted.Id INTO intermediate (codeId, EmployeeId, Z.Number1, Z.Number2) 
select id,0,1,CONCAT(x.Description,' - ',y.Descritpion) 
from dba.Z 
left outer join dba.X as x on x.Id = IdX 
left outer join dba.Y as y on y.Id = IdY 

Но это не будет работать, потому что я не получил набор сотрудников. Может ли кто-нибудь помочь мне с решением? Или мне действительно нужно использовать курсор?

Примечание: я поменял источник на анонимные данные.

+0

Откуда вы знаете, с каким сотрудником следует объединять записи?Я не вижу ни одного сотрудника, на который ссылается ни один из X, Y или Z. –

+0

Все сотрудники должны быть объединены со всеми кодами. – Jeffrey

ответ

0

Сделайте это поэтапно. Сначала создайте таблицу code со ссылкой на существующие таблицы: code(id, description, idx, idy).

Затем вставьте записи:

insert into code (idx, idy, description) 
select x.id, y.id, x.description + ' - ' + y.description 
from x 
cross join y; 

затем создать таблицу intermediate и заполнить его:

insert into intermediate (idcode, number1, number2, idemployee) 
select code.id, z.number1, z.number2, employees.id 
from code 
join z on z.idx = code.idx and z.idy = code.idy 
cross join employees; 

Затем вы можете удалить idx и idy из таблицы code и падения ваших старых таблиц.

+0

Спасибо, в значительной степени, что я имел в виду, если не было более разумного способа сделать это. – Jeffrey