Ändern von Daten mithilfe der FROM-Klausel
Mit der FROM-Klausel rufen Sie aus mindestens einer Tabelle oder Sicht Daten für die zu aktualisierende Tabelle ab. Das folgende Beispiel ändert die SalesYTD-Spalte in der SalesPerson-Tabelle, um die aktuellen Umsätze widerzuspiegeln, die in der SalesOrderHeader-Tabelle aufgezeichnet wurden.
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
In vorangegangenen Beispiel wird vorausgesetzt, dass für einen angegebenen Vetriebsmitarbeiter nur ein Verkauf an einem bestimmten Datum aufgezeichnet wird und dass die aktuellen Aktualisierungen angewendet wurden. Wenn für einen angegebenen Vertriebsmitarbeiter mehrere Verkäufe pro Tag aufgezeichnet werden können, funktioniert das dargestellte Beispiel nicht richtig. Das Beispiel wird zwar fehlerlos ausgeführt, jeder SalesYTD -Wert wird jedoch mit nur einem Verkauf aktualisiert, unabhängig davon, wie viele Verkäufe an diesem Tag tatsächlich stattgefunden haben. Der Grund hierfür ist, dass eine einzelne UPDATE-Anweisung dieselbe Zeile niemals zweimal ändert.
Wenn für einen angegebenen Vertriebsmitarbeiter mehrere Verkäufe pro Tag möglich sind, müssen sämtliche Verkäufe der einzelnen Vertriebsmitarbeiter mithilfe der UPDATE-Anweisung aggregiert werden, wie im nachfolgenden Beispiel dargestellt.
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