使用三个表合并股票的声明

Sri*_*Sri 1 t-sql sql-server merge

这是SQL查询:

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 ;
Run Code Online (Sandbox Code Playgroud)

所需结果:需要导入表中Products尚未包含的订单tblProductsSold

mar*_*c_s 7

你不能像现在这样做而接近它.

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 ;
Run Code Online (Sandbox Code Playgroud)