Изменение данных при помощи предложения FROM
Предложение FROM используется для запроса данных из одной или нескольких таблиц или представлений и помещения их в обновляемую таблицу. В следующем примере изменяется столбец SalesYTD в таблице SalesPerson для отражения последних данных о продажах, зафиксированных в таблице 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