星期五, 1月 20, 2012

[SQL] UPDATE 搭配 FROM 使用

發現 UPDATE 的一個情況,經過測試和查閱 MSDN 後,才發現原來 UPDATE 搭配 FROM 使用時,必須注意下列這點。
擷取 MSDN UPDATE 內容,內容如下:
指定 FROM 子句來提供更新作業的準則時,請特別小心。如果 UPDATE 陳述式包括 FROM 子句,且這個 FROM 子句的指定方式並非每個更新的資料行項目都只能使用一個值,也就是說,如果 UPDATE 陳述式不具決定性,UPDATE 陳述式的結果便未定義。這可能會造成非預期的結果。
簡單說就是, 透過 UPDATE 搭配 FROM 使用時,資料必須是 1 對 1 的情況,假如是 1 對 多 , UPDATE 沒有辦法分辨要選擇哪一筆資料來更新。
DECLARE @table1 table (MtNO char(12),Qty numeric(10,2)) -- 庫存總表
DECLARE @table2 table (MtNO char(12),Qty numeric(10,2)) -- 入領料表
INSERt INTO @table1 VALUES ('A',0)
INSERt INTO @table2 VALUES ('A',50)
INSERt INTO @table2 VALUES ('A',30)
INSERt INTO @table2 VALUES ('A',20)
INSERt INTO @table2 VALUES ('A',10)

-- 把 @table2 (入領料表)內的 A 物料數量更新到 @table1(庫存總表)
UPDATE T1 SET T1.Qty = T2.Qty
FROM @table1 AS T1 
  JOIN @table2 AS T2 ON T1.MtNO = T2.MtNO

-- 顯示更新後的 @table1 (庫存總表)
SELECT * FROM @table1

沒有留言:

張貼留言