2011-03-25 23 views
0

我试图查询2个表来生成第三个表的记录,该表只有时链接到其他两个表,并插入为第三个表生成的ID到第四个表中,如果已经在第三个表中生成记录,可以使用它来防止重新生成。以下是我想要做的一个简化例子。插入带有可选链接的链接记录的生成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 2011-03-25 20:57:34

+0

指定列的选项之一是from_table_name,它应该与delete或update语句的from子句一起使用。他们遗漏了关于该功能的插入语句只是一种遗憾。 – BlueMonkMN 2011-03-26 03:17:19

回答

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

他的问题与范围标识有什么关系? – 2011-03-26 03:43:04

+0

他=我(我找到了我自己的答案)。这类似于关于Scope_Identity的问题,因为它试图获取生成的ID值,但是我想要一次性完成整批记录,而不是逐个执行。我想我明白了。 – BlueMonkMN 2011-03-26 03:47:46

+0

通常,获得一批生成的ID值(在输出子句中只使用inserted.id)并不复杂,但我的挑战在于我想插入生成的ID值*以及一个ID值不在输入表中的插入语句中。这很棘手,显然,但仍然有可能。我仍然有点惊呆了,经过这么多小时,我终于想出了一个答案,并想知道它是否确实是正确的。 – BlueMonkMN 2011-03-26 03:51:38