如何在select-insert语句中跟踪自动生成的id

时间:2010-12-21 20:47:18

标签: sql sql-server-2005

我有两张桌子细节和头部。详细信息表将首先编写。之后,将编写头表。头部是详细信息表的摘要。我想从细节到头表保持参考。我有一个解决方案,但它不优雅,需要复制求和过程中使用的连接和过滤器。我正在寻找更好的解决方案。以下是我目前拥有的一个例子。在这个例子中,我简化了表结构。在现实世界中,总和非常复杂。

-- Preparation
create table #detail (
      detail_id int identity(1,1)
    , code char(4)
    , amount money 
    , head_id int null
    );

create table #head (
      head_id int identity(1,1)
    , code char(4)
    , subtotal money
    );

insert into #detail ( code, amount ) values ( 'A', 5 );
insert into #detail ( code, amount ) values ( 'A', 5 );
insert into #detail ( code, amount ) values ( 'B', 2 );
insert into #detail ( code, amount ) values ( 'B', 2 );


-- I would like to somehow simplify the following two queries
insert into #head ( code, subtotal )
    select code, sum(amount)
    from #detail
    group by code

update #detail 
  set head_id = h.head_id
from #detail d
  inner join #head h on d.code = h.code

-- This is the desired end result
select * from #detail

详细表格的最终结果:

  detail_id  code  amount  head_id
  1          A     5.00    1
  2          A     5.00    1
  3          B     2.00    2
  4          B     2.00    2

2 个答案:

答案 0 :(得分:3)

为什么不先插入head行,然后在插入detail行时加入头?换句话说,如果您知道将要用于详细记录的不同代码(示例中的A和B),您可以继续将它们插入head表中。然后,您可以在之后插入detail条记录,加入head以获取相应代码的head_id值。

答案 1 :(得分:0)

从你的主题我会说这个。

你见过OUTPUT clause吗?

它允许您将ID分配给变量,因此您不需要临时表。

但是从你的身体来看,我真的不明白你在做什么......