FROM 句を使用したデータの変更

1 つ以上のテーブルまたはビューから、更新するテーブルにデータを追加するには、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

上記の例は、指定した販売員による特定の日付の売上高が 1 つだけ記録され、最新状態に更新されることが前提になっています。指定した販売員の同じ日の売上高を複数記録できる場合、この例は正しく機能しません。この場合、エラーなしで実行されますが、実際に同じ日に記録された売り上げ件数に関係なく、それぞれの SalesYTD 値につき 1 件の売り上げしか更新されません。これは、1 つの UPDATE ステートメントで同じ行を 2 回更新できないためです。

同じ日に、指定した販売員の売り上げが複数記録されるような場合は、次の例のように、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