我正在尝试聚合细节并为它们创建标题记录。将外键分配回详细信息的最佳方法是什么?
详细信息表将具有ID(标识)和HeaderID(标头表的外键)。在汇总详细信息并插入Header表后,如何将Header ID重新关联到各个详细信息中?
我考虑使用触发器使用标头ID中的@@ Identity来更新Details表。但是,由于两者之间没有关联(这就是我正在尝试构建的),我不确定在WHERE子句中要做什么来进行更新。
以下查询应该为您提供一些示例数据。如果执行它,那么NULL值在#OrderLine表中的地方就是我将OrderId关联回来的问题。
{{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