Freigeben über


Ä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