【问题标题】:Merge statement for stocks using three tables使用三个表的股票合并语句
【发布时间】:2013-02-11 21:07:39
【问题描述】:

这是 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 表中的订单

【问题讨论】:

    标签: sql-server tsql merge


    【解决方案1】:

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

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

    现在,您使用 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 ;
    

    【讨论】:

    • 谢谢我做了一些类似的事情并设法完成了结果
    猜你喜欢
    • 2016-09-25
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    相关资源
    最近更新 更多