使用重复键

时间:2016-09-15 11:15:54

标签: sql sql-server

我有一个临时表 a ,其中包含idproduct,数量与

相似
idproduct    Qty
   123        2
   123        2

b 一样

idproduct    stock
   123        10

然后我要更新(b.stock-a.qty) 所以我想要像

这样的结果
idproduct    stock
   123        6

但它让我很喜欢

**idproduct    stock
    123        8**

来自评论:

UPDATE INV
    SET INV.stock = isnull(INV.stock,0) - ISNULL(TEMP.QTY,0)
    FROM INVENTORY INV, #TempBagPack TEMP
    WHERE INV.idproduct = TEMP.idproduct

2 个答案:

答案 0 :(得分:0)

首先。 从不FROM子句中使用逗号。 始终使用明确的JOIN语法。

其次,您的问题是多行匹配更新,但SQL Server仅更新行一次。这是有据可查的。

解决方案是预先汇总数据:

update i
    set i.stock = coalesce(i.stock, 0) - coalesce(t.qty, 0)
    from inventory i join
         (select idproduct, sum(qty) as qty
          from #TempBagPack t
          group by idproduct
         ) t
         on i.idproduct = t.idproduct;

documentation中的警告是:

  

指定FROM子句以提供条件时要小心   用于更新操作。 UPDATE语句的结果是   如果语句包含不是的FROM子句,则为undefined   以这样的方式指定,每个只有一个值可用   更新的列出现,即UPDATE语句是否   不确定。

答案 1 :(得分:0)

@Gordon Linoff明确提到了您的查询中的问题。

这只是使用CTE编写脚本的另一种方式。

     ;with cte_1
     As
     (select idproduct, sum(qty) as qty
      from #TempBagPack t
      group by idproduct
     ) 
     update i
    set i.stock = coalesce(i.stock, 0) - coalesce(t.qty, 0)
    from Cte_1 t
       Join inventory i
         on i.idproduct = t.idproduct;