将外键与SQL Server中的详细信息表关联的最佳方法是什么?

时间:2017-11-30 17:46:11

标签: sql sql-server header detail

我正在尝试聚合细节并为它们创建标题记录。将外键分配回详细信息的最佳方法是什么?

详细信息表将具有ID(标识)和HeaderID(标头表的外键)。在汇总详细信息并插入Header表后,如何将Header ID重新关联到各个详细信息中?

我考虑使用触发器使用标头ID中的@@ Identity来更新Details表。但是,由于两者之间没有关联(这就是我正在尝试构建的),我不确定在WHERE子句中要做什么来进行更新。

以下查询应该为您提供一些示例数据。如果执行它,那么NULL值在#OrderLine表中的地方就是我将OrderId关联回来的问题。

{{1}}

1 个答案:

答案 0 :(得分:0)

我想我找到了一种方法。对于LineItem,我使用了ROW_NUMBER()和PARTITION。对于OrderId,我刚刚根据OrderId为NULL的聚合条件更新了详细信息。

如果有人有更好的建议,请告诉我。

Create Table #Order
(OrderId int identity primary key,
TypeId char(1),
Total decimal(5,2)
)

Create Table #OrderLine
(OrderLineId int identity,
OrderId int constraint FK_OrderId foreign key (OrderId) references [#Order](OrderId),
LineItem int,
TypeId char(1),
Item varchar(30),
Price decimal (5,2)
)

Insert into #OrderLine (TypeId,Item, Price)
Values('S', 'Tennis Racket', 120)
Insert into #OrderLine (TypeId,Item, Price)
Values('C', 'Red Dress', 80)
Insert into #OrderLine (TypeId,Item, Price)
Values('S', 'Basketball', 30)
Insert into #OrderLine (TypeId,Item, Price)
Values('C', 'Dress Shirt', 60)
Insert into #OrderLine (TypeId,Item, Price)
Values('S', 'Pingpong Balls', 10)
Insert into #OrderLine (TypeId,Item, Price)
Values('S', 'Soccer Ball', 25)
Insert into #OrderLine (TypeId,Item, Price)
Values('C', 'Shorts', 20)

Insert into #Order(TypeId, Total)
Select  #OrderLine.TypeId
        ,SUM(#OrderLine.Price)
From    #OrderLine
Group by #OrderLine.TypeId

--Update OrderId back to #OrderLine
Update #OrderLine
Set OrderId = #Order.OrderId
From    #Order
Where   #Order.TypeId = #Orderline.TypeId
and     #OrderLine.OrderId is null

--Assign the LineItem per Order
Update #OrderLine
Set LineItem = TT.LineItemId
From    #OrderLine as T
join    (Select ROW_NUMBER() OVER (PARTITION BY OrderId, TypeId ORDER BY OrderLineId) as LineItemId
            ,OrderLineId
            ,OrderId
            ,TypeId
            From #OrderLine) as TT on TT.OrderLineId = T.OrderLineId
Where   T.LineItem is null

Select * From #OrderLine
Select * From #Order

Drop Table #Order
Drop Table #OrderLine