Share via


Modifica dei dati con la clausola FROM

La clausola FROM consente di estrarre dati da una o più tabelle o viste e di inserirli nella tabella da aggiornare. Nell'esempio seguente la colonna SalesYTD della tabella SalesPerson viene modificata in modo che includa i dati delle vendite più recenti registrate nella tabella SalesOrderHeader.

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

L'esempio precedente prevede che sia registrata una sola vendita per un determinato venditore in una data specifica e che i dati siano aggiornati. Se è invece possibile registrare più vendite per un determinato venditore nello stesso giorno, l'esempio non funziona correttamente. L'esempio viene eseguito senza errori, ma ogni valore di SalesYTD viene aggiornato con una sola vendita, indipendentemente dal numero effettivo di vendite relative al giorno specificato. Una singola istruzione UPDATE, infatti, non aggiorna mai la stessa riga due volte.

Nel caso in cui sia possibile registrare più vendite per un determinato venditore nello stesso giorno, tutte le vendite relative allo stesso venditore devono essere aggregate all'interno dell'istruzione UPDATE, come illustrato nell'esempio seguente.

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