如何使用SQL Merge填充Master Detail相关表

时间:2012-01-21 22:05:58

标签: sql merge

我一直在搜索,我还没有找到一个使用merge来填充相关表格的例子。

Northwind DB Order&可以使用OrderDetail个表。 (在我们的场景中,我们的表格深度为3级。)

为简单起见,我们假设我们有以下表格。

订单

OrderID PK
OrderNumber 

订单明细

OrderID - PK
OrderLineItemNumber PK - FK to Orders.OrderID field

OrderDetailDetails

OrderID - PK - FK to OrderDetails.OrderID
OrderLineItemNumber - PK - FK to OrderDetails.OrderLineItemNumber
OrderSequenceNumber - PK

此外,在此方案中,记录将写入与上表相同的登台表。合并需要将3个临时表中的记录合并到3个匹配的生产表中。

制作Order表的OrderId不会共享暂存OrderOrderId值。

因此,如果满足合并条件,则必须插入Order表以生成OrderId(设置为identity),因为OrderId需要OrderDetail }&

。要创建OrderDetailDetails行。

现在我已经用C#写了一个服务来完成所有这些,但它不是那么高效。

MERGE被发现,所以我们正在研究它是否可以在这种情况下使用它。任何提示或指示将不胜感激。

感谢。

编辑:我现在将输出存储值用于名为@MergeOutput的临时表。

Declare @MergeOutput Table
(
      ActionType varchar(10),
      InsertedOrderId int,
      StagingOrderID int,
      DeletedOrderId int
);

However, I need to do a Merge on all 3 tables.  (Order, OrderDetail & OrderDetailDetails)

Also, these tables have more fields than just the Id's.

So I've started creating the 2nd Merge for the OrderDetail table.

MERGE OrderDetail AS OD
USING(
    SELECT OrderID,
          OrderLineItemNumber,
      ProductId
   FROM OrderDetail AS OD
   where OrderId IN (Select StagingOrderID from @MergeOutput where ActionType = 'INSERT'
) AS src(OrderID,
      OrderLineItemNumber,
      ProductId
)
ON (OD.OrderId = src.Order AND OD.OrderLineItemNumber = src.OrderLineItemNumber)
WHEN NOT MATCHED By Target THEN

INSERT INTO <-- (This doesn't work no matter what I've tried so far.)
  Select (Select Distinct InsertedOrderID from @MergeOutput where StagingOrderId = OrderID), src.OrderLineItemNumber, src.ProductId
;

我在上面的代码中看到以下错误。 “关键字'附近的语法不正确'到'

我需要Merge的功能来移动所有3个表上的记录

看起来我终于有了这个工作。我必须将Insert语句更改为如下。

Insert(OrderId, OrderLineItemId, ProductID)
Values((Select Distinct InsertedOrderID from @MergeOutput where StagingOrderId = OrderID), src.OrderLineItemNumber, src.ProductId)

我之前尝试过这个Insert语句。我只是想通了我必须包装选择parens()。

感谢大家的帮助。我希望我可以把它带到第三张桌子的合并。

1 个答案:

答案 0 :(得分:0)

这是一个令人讨厌的问题,一直存在。您需要提取插入的标识值。在SQL Server中,您可以使用OUTPUT子句(http://msdn.microsoft.com/en-us/library/ms177564.aspx)和INSERT“虚拟表”来执行此操作。这允许您在一个语句中输出所有插入的ID。

然后,您可以将ID推送到临时表中,并使用它们插入具有相应主ID的详细记录,如下所示:

INSERT INTO Detail
SELECT * from Staging_Detail
JOIN #MasterIDs on Staging_Detail.MasterID = #MasterIDs.MasterID