Поделиться через


Изменение данных при помощи предложения 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