Comment combiner des instructions de mise à jour SQL en une instruction unique

J'ai les tables SQL Server suivantes. Dans le but de ma question, il ne peut y avoir qu'une "Personne" avec un nom donné ( Person , ou une combinaison de Person + Year est la key primaire des tables).

 DailySalesSummary +------+--------+---------+------+-------------+-------------+-----------+ | Year | Person | Family | City | PersonSales | FamilySales | CitySales | +------+--------+---------+------+-------------+-------------+-----------+ | 2013 | Jim | Smith | 1 | $10 | $10 | $10 | | 2013 | Anna | Smith | 1 | $0 | $10 | $10 | | 2013 | John | Stewart | 3 | $8 | $8 | $13 | | 2013 | Todd | Johnson | 3 | $4 | $5 | $13 | | 2013 | Alan | Johnson | 3 | $1 | $5 | $13 | +------+--------+---------+------+-------------+-------------+-----------+ SalesSummary +------+--------+-------------+-----------+ | Year | Person | FamilySales | CitySales | +------+--------+-------------+-----------+ | 2013 | Jim | $55 | $55 | | 2013 | Anna | $55 | $55 | | 2013 | John | $24 | $39 | | 2013 | Todd | $10 | $39 | | 2013 | Alan | $5 | $39 | +------+--------+-------------+-----------+ Reference +--------+--------+------+ | Person | Family | City | +--------+--------+------+ | Jim | Smith | 1 | | … | … | … | +--------+--------+------+ 

Je veux mettre à jour la table SalesSummary avec le contenu de la table DailySalesSummary . Je l'ai fait de la façon suivante:

 UPDATE SalesSummary SET FamilySales = SalesSummary.FamilySales + p.FamilySales FROM DailySalesSummary p, Reference bx WHERE SalesSummary.Person= bx.Person AND bx.City = p.City AND bx.Family = p.Family AND SalesSummary.Year = p.Year UPDATE SalesSummary SET CityTotal = SalesSummary.FamilyTotal + p.FamilyTotal FROM DailySalesSummary p, Reference bx WHERE SalesSummary.Person = bx.Person AND bx.City = p.City AND SalesSummary.Year = p.Year 

Je voudrais find un moyen de combiner les deux instructions de mise à jour dans une seule instruction de mise à jour qui prendra soin de tout, mais je ne peux pas déterminer la structure exacte nécessaire.

Excusez-vous si la solution nécessaire est offensivement facile, mais j'apprécie toute aide.

Vous pouvez le faire avec une seule mise à jour:

 UPDATE SalesSummary SET FamilySales = SalesSummary.FamilySales + (case when bx.Family = p.Family then p.FamilySale else 0 end), CityTotal = SalesSummary.FamilyTotal + p.FamilyTotal FROM DailySalesSummary p, Reference bx WHERE SalesSummary.Person = bx.Person AND bx.City = p.City AND SalesSummary.Year = p.Year; 

Cela lui FamilySales dans les lignes qui ne correspondent pas à la condition bx.Family = p.Family . Mais cela devrait avoir le même effet que vos deux requêtes.

MODIFIER:

Ce qui suit semble fonctionner sur datatables que vous avez:

 UPDATE ss set FamilySales = ss.FamilySales + dss.FamilySales, CitySales = ss.CitySales + dss.CitySales FROM SalesSummary ss join DailySalesSummary dss on ss.Person = dss.Person and ss.City = dss.City ss.Family = dss.Family; 

Je ne comprends pas pourquoi il y a une jointure à la table bx . Vous pouvez toujours le faire si vous voulez filterr les choses.

Pour autant que je DailySalesSummary , datatables de DailySalesSummary sont alignées sur ce qui doit être mis à jour, donc une simple join réunit les bonnes lignes.

En fait, vous ne pouvez pas mettre à jour plus d'une table avec une seule instruction UPDATE . Plus d'informations peuvent être trouvées à cette réponse Stack Overflow.

Si toutes les colonnes en cours de mise à jour se trouvent dans la même table et proviennent des mêmes tables source, vous pouvez simplement mettre à jour plusieurs colonnes en procédant comme suit:

 UPDATE SalesSummary SET FamilySales = SalesSummary.FamilySales + p.FamilySales, CityTotal = SalesSummary.FamilyTotal + p.FamilyTotal FROM DailySalesSummary p, Reference bx WHERE SalesSummary.Person= bx.Person AND bx.City = p.City AND bx.Family = p.Family AND SalesSummary.Year = p.Year 

Bien que je ne reorderais pas SQL 2000 jointures de style SQL 2000 . Le retravailler ressemblerait à ceci:

 UPDATE SalesSummary SET FamilySales = SalesSummary.FamilySales + p.FamilySales, CityTotal = SalesSummary.FamilyTotal + p.FamilyTotal FROM DailySalesSummary p JOIN Reference bx ON bx.City = p.City AND bx.Family = p.Family WHERE SalesSummary.Year = p.Year AND SalesSummary.Person = bx.Person 

Réponse mise à jour

 UPDATE s SET s.FamilySales = s.FamilySales + fam.FamilySales, s.CitySales = s.CitySales + city.CitySales FROM SalesSummary s JOIN Reference r ON r.Person = s.Person JOIN (SELECT DISTINCT Year, Family, FamilySales FROM DailySalesSummary) fam ON fam.Family = r.Family AND fam.Year = s.Year JOIN (SELECT DISTINCT Year, City, CitySales FROM DailySalesSummary) city ON city.City = r.City AND city.Year = s.Year 

Vous pouvez voir un exemple de travail ici à SQLFiddle .