使用 FROM 子句來變更資料
使用 FROM 子句將一或多個資料表或檢視中的資料,提取到您要更新的資料表。以下範例將修改 SalesPerson 資料表中的 SalesYTD 資料行,以反映 SalesOrderHeader 資料表中所記錄的最新銷售額。
USE AdventureWorks2008R2;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD + SubTotal
FROM Sales.SalesPerson AS sp
JOIN Sales.SalesOrderHeader AS so
ON sp.BusinessEntityID = so.SalesPersonID
AND so.OrderDate = (SELECT MAX(OrderDate)
FROM Sales.SalesOrderHeader
WHERE SalesPersonID = sp.BusinessEntityID);
GO
先前範例是假設指定銷售人員在指定日期僅記錄一筆銷售額,並且目前是最新的記錄。如果指定銷售人員在同一天要記錄超過一筆銷售額,上述範例則無法正確作。範例執行時不會發生錯誤,但是無論該日實際上發生多少銷售額,每一個 SalesYTD 值只會更新一個銷售額。這是因為單一 UPDATE 陳述式不會對同一個資料列更新兩次。
如果在同一天內,指定的銷售人員可以有多筆銷售額,則必須在 UPDATE 陳述式內彙總每一個銷售人員的所有銷售額,如下列範例所示:
USE AdventureWorks2008R2;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD +
(SELECT SUM(so.SubTotal)
FROM Sales.SalesOrderHeader AS so
WHERE so.OrderDate = (SELECT MAX(OrderDate)
FROM Sales.SalesOrderHeader AS so2
WHERE so2.SalesPersonID = so.SalesPersonID)
AND Sales.SalesPerson.BusinessEntityID = so.SalesPersonID
GROUP BY so.SalesPersonID);
GO