2010-12-21 20 views
0

我有兩個表格詳細信息和頭部。詳細表格將首先寫入。之後,頭表將被寫入。頭是細節表的摘要。我想保留頭表的細節參考。我有一個解決方案,但它並不優雅,需要重複求和過程中使用的連接和過濾器。我正在尋找更好的解決方案。以下是我目前擁有的一個例子。在這個例子中,我簡化了表格結構。在現實世界中,總和非常複雜。詳細信息表的如何在選擇插入語句中跟蹤自動生成的ID

-- 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 

回答

0

從你的主題我會說這個。

你見過OUTPUT clause嗎?

它可以讓你分配你的ID到變量,所以你不需要臨時表。

但是從你的身體,我真的不明白你在做什麼?

3

爲什麼不直接插入head排第一,然後再加入頭插入detail行時?換句話說,如果您知道將要用於詳細記錄的不同代碼(在您的示例中爲A和B),則可以繼續並將它們插入head表中。然後,您可以在之後插入detail記錄,並加入以獲取相應代碼的head_id值。

+0

生成詳細記錄是從生成頭記錄的過程中獨立的過程,但感謝您的建議。 – 2010-12-21 20:55:29

+0

+1:這是父母/子女關係中的約定 – 2010-12-21 20:56:03