1

Here is the SQL Query:

MERGE  tblProductsSold

USING tblOrders on tblOrders.OrderID = tblProductsSold.txtOrderID

WHEN NOT MATCHED THEN 

Insert ( txtOrderID, txtOrderdate, txtPartno, txtQty)  
values 
(SELECT tblItemsOnOrder.txtOrderID, 
 tblOrders.txtDateTime, 
 tblItemsOnOrder.txtPartNO, 
 tblItemsOnOrder.txtQTY
FROM tblOrders  INNER JOIN tblItemsOnOrder 
ON tblOrders.OrderID = tblItemsOnOrder.txtOrderID
WHERE tblOrders.txtIsConfirmed = '1'
)

OUTPUT $action ;

Desired Result: need to import orders with Products that are not already in the tblProductsSold table

4

1 回答 1

12

你不能像现在这样接近它。

MERGE语句合并两个表 - 您在标题中定义的两个表 -表和目标表。

现在,您将tblOrders其用作源和tblProducts目标。仅此一项似乎很奇怪-您正在尝试将订单合并到产品中?好像不太合适...

一旦你定义了你的源表和目标表 - 你统计比较源中的哪些行存在于目标中(或不存在)。如果源中的给定行不存在于目标中 - 那么您可以将其值插入目标表中。

但这适用于源表中的直接列值!你不能像你试图做的那样出去对其他表进行子查询!

所以我相信你真正应该做的是:

  • 作为您的来源- 有一个视图列出在您的订单中找到的产品 -产品(不是订单本身)

  • 然后将您的Products表与此视图进行比较 - 如果您的订单碰巧有任何产品不存在于基Products表中 - 插入它们。

所以你需要类似的东西:

MERGE  tblProductsSold AS Target
USING (SELECT tblItemsOnOrder.txtOrderID, tblOrders.txtDateTime, 
              tblItemsOnOrder.txtPartNO, tblItemsOnOrder.txtQty
       FROM tblOrders  
       INNER JOIN tblItemsOnOrder ON tblOrders.OrderID = tblItemsOnOrder.txtOrderID
       WHERE tblOrders.txtIsConfirmed = '1') AS Source
   ON Source.OrderID = Target.txtOrderID

WHEN NOT MATCHED THEN 
    INSERT (txtOrderID, txtOrderdate, txtPartno, txtQty)  
    VALUES (Source.OrderID, Source.txtDateTime, Source.txtPartNo, Source.txtQty)

OUTPUT $action ;
于 2013-02-26T12:13:25.950 回答