使用 FROM 子句來變更資料

使用 FROM 子句將一或多個資料表或檢視中的資料,提取到您要更新的資料表。以下範例將修改 SalesPerson 資料表中的 SalesYTD 資料行,以反映 SalesOrderHeader 資料表中所記錄的最新銷售額。

USE AdventureWorks;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD + SubTotal
FROM Sales.SalesPerson AS sp
JOIN Sales.SalesOrderHeader AS so
    ON sp.SalesPersonID = so.SalesPersonID
    AND so.OrderDate = (SELECT MAX(OrderDate)
                        FROM Sales.SalesOrderHeader 
                        WHERE SalesPersonID = 
                              sp.SalesPersonID);
GO

先前範例是假設指定銷售人員在指定日期僅記錄一筆銷售額,並且目前是最新的記錄。如果指定銷售人員在同一天要記錄超過一筆銷售額,上述範例則無法正確作。範例執行時不會發生錯誤,但是無論該日實際上發生多少銷售額,每一個 SalesYTD 值只會更新一個銷售額。這是因為單一 UPDATE 陳述式不會對同一個資料列更新兩次。

如果在同一天內,指定的銷售人員可以有多筆銷售額,則必須在 UPDATE 陳述式內彙總每一個銷售人員的所有銷售額,如下列範例所示:

USE AdventureWorks;
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.SalesPersonID = so.SalesPersonID
     GROUP BY so.SalesPersonID);
GO