2016-09-15 78 views
-1

我有一个临时表与idproduct和数量一样更新与重复键

idproduct Qty 
    123  2 
    123  2 

而且anoth表b

idproduct stock 
    123  10 

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

idproduct stock 
    123  6 

但它给我reult像

**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

您正在使用哪些DBMS? –

+2

请添加您的SQL语句。另外为什么表格a有相同idproduct的行?这不是独一无二的吗? – RvdK

+0

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

回答

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子句,则该值只有一个值可用于更新每个 列事件,也就是说UPDATE语句不是确定性的 。

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;