2011-03-25 9 views
0

2つのテーブルを照会して、他のテーブルの両方にリンクする3番目のテーブルのレコードを生成し、3番目のテーブル第3のテーブルにすでにレコードが生成されている場合は、再生成を防ぐために使用できる4番目のテーブルに追加します。以下は私がしようとしているものの単純化された例です。オプションのリンクを持つリンクレコードの生成IDを別のテーブルに挿入する

create table #T1(id1 int primary key identity(100,1) not null, value nvarchar(10)) 
create table #T2(id2 int primary key identity(200,1) not null, value nvarchar(10)) 
insert into #T1(value) values('a') 
insert into #T1(value) values('b') 
insert into #T1(value) values('c') 
insert into #T2(value) values('c') 
insert into #T2(value) values('b') 
insert into #T2(value) values('d') 
create table #T3(id3 int primary key identity(300,1) not null, id2 int null, value nvarchar(10)) 
create table #T3Info(id1 int not null, id3 int not null) 

insert into #T3(id2, value) 
output inserted.id2 
,#T1.id1 
into #T3Info(id1, id3) 
select #T2.id2, #T1.value 
from #T1 
left join #T2 on #T1.value = #T2.value 
left join #T3Info join #T3 on #T3.id3 = #T3Info.id3 
on #T3Info.id1 = #T1.id1 
where #T3Info.id1 is null 

#T1.id1が#T3に挿入されていないため、これを行うことはできません。 #T1から#T3までのスキーマを変更することなく、#T3Infoに必要な情報を取得するにはどうすればよいですか?

私はで終わるしたいと思います:

T3:

id3 | id2 | value 
---------+--------+--------- 
    300 | NULL | a 
    301 | 201 | b 
    302 | 200 | c 

T3Info:

id1 | id3 
--------+-------- 
    100 | 300 
    101 | 301 
    102 | 302 
+0

OUTPUTは、トリガーを作成することなく、データが挿入された挿入を同時にログまたは監査するのを少し容易にするために開発されたようです。私は明示的にそういうものは見つけられません(ここで説明されているが十分でない限り:http://msdn.microsoft.com/en-us/library/ms177564.aspx)しかし、私は#T1を推測するつもりですOUTPUTの範囲外です。たぶんT3でトリガーが必要なのかもしれません。 – user662852

+0

列を指定するためのオプションの1つはfrom_table_nameで、delete文またはupdate文のfrom句と一緒に使用されることになっています。それは彼らがその機能についての挿入ステートメントを省いたことはちょっと残念です。 – BlueMonkMN

答えて

0

私はこの文は、トリックを行いますと思います!

merge into #T3 
using(
select #T1.id1, #T1.value 
,#T2.id2 
,#T3Info.id3 
from #T1 
left join #T2 on #T1.value = #T2.value 
left join #T3Info on #T3Info.id1 = #T1.id1) src 
on src.id3 = #T3.id3 
when not matched by target then 
insert(id2, value) values(src.id2, src.value) 
output src.id1, inserted.id3 
into #T3Info; 

この信頼性についてのご意見はありますか?

+0

彼の質問はスコープのアイデンティティと関係がありますか? –

+0

彼は私です(自分の答えを見つけました)。これは、生成されたID値を取得しようとしているため、Scope_Identityに関する質問と似ていますが、1つずつではなく一度にレコードのバッチ全体に対して実行したいと考えています。私はそれを理解したと思う。 – BlueMonkMN

+0

通常、生成されたID値のバッチを取得するのは複雑ではありませんが(出力節にinserted.idを使用するだけです)、ここで私が生成したID値*をID値と共に挿入したいということでした。出力テーブルへの挿入文にありませんでした。それは明らかに難しいですが、それでも可能です。私はまだまだ驚いています。何時間もした後、最終的に答えが出てきて、それが本当に正しいかどうか疑問に思います。 – BlueMonkMN