2016-09-15 105 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;