Partager via


Modification de données à l'aide de la clause FROM

La clause FROM permet d'extraire des données d'une ou de plusieurs tables ou vues et de les insérer dans la table à mettre à jour. L'exemple ci-après modifie la colonne SalesYTD de la table SalesPerson afin de refléter les dernières ventes enregistrées dans la table 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

L'exemple précédent suppose qu'une seule vente est enregistrée pour un commercial donné à une date précise et que les mises à jour sont actuelles. S'il est possible d'enregistrer plusieurs ventes d'un commercial donné le même jour, l'exemple présenté ici ne fonctionnera pas correctement. Il s'exécutera sans erreur mais chaque valeur de SalesYTD ne sera mise à jour qu'avec une seule vente, en dépit du nombre de ventes ayant réellement eu lieu le jour dit. Cela est dû au fait qu'une instruction UPDATE unique ne met jamais à jour la même ligne deux fois.

Au cas où plusieurs ventes pourraient avoir lieu le même jour pour un commercial donné, toutes les ventes de chaque commercial doivent être cumulées dans l'instruction UPDATE, comme le montre l'exemple suivant :

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