2016-05-13 11 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の組み合わせです。 1つは従業員に、もう1つはテーブル「コード」に)。加えて、これらの2 FKのこのテーブルは、両方の新しいテーブルのテーブルZ.例の数字が含まれています:

表コードだから私は検索しました

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

中間

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

表この特定の問題については、まったく同じ問題を見つけることはできませんでした。私が見つけた最も近いものは:How can I INSERT data into two tables simultaneously in SQL Server?

しかし、これは新しいテーブルのそれぞれに1つのレコードを持つ2つの新しいテーブルに挿入される約1つの古いレコードです。私がやっているのは、古い中間テーブルで見つかったXとYの組み合わせごとに新しいレコードをテーブル 'code'に挿入することです。次に、新しい中間レコードに新しいレコードを挿入して、 'code'のすべての新しいレコードを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; 

次にあなたがテーブルcodeからidxidyを削除し、古いテーブルをドロップすることができます。

+0

ありがとう、それを行うよりスマートな方法がなかったら私が念頭に置いていたもの。 – Jeffrey

関連する問題