使用 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