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

时间:2013-02-26 12:05:28

标签: sql-server tsql 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 ;

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

1 个答案:

答案 0 :(得分:7)

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

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

目前,您使用tblOrders作为来源,tblProducts作为目标。仅此一点似乎很奇怪 - 您正在尝试将订单合并到产品中?似乎不太合适...

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

适用于源表中的直接列值!当你想要做的时候,你不能出去做子查询到其他表格!

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

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

    < / LI>
  • 然后将您的Products表与此视图进行比较 - 如果您的订单恰好有基本Products表中没有的任何产品 - 请插入它们。

    < / LI>

所以你需要这样的东西:

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 ;