<p>Vous n’avez pas tout à fait la bonne syntaxe propriétaire <code>UPDATE FROM</code> de SQL Server. De plus, je ne suis pas sûr de la raison pour laquelle vous avez eu besoin de joindre sur le <code>CommonField</code> et aussi de filtrer dessus ensuite. Essayez ceci :</p>
<pre><code class="lang-auto">UPDATE t1
SET t1.CalculatedColumn = t2.[Calculated Column]
FROM dbo.Table1 AS t1
INNER JOIN dbo.Table2 AS t2
ON t1.CommonField = t2.[Common Field]
WHERE t1.BatchNo = '110';
</code></pre>
<p>Si vous faites quelque chose de peu judicieux - comme essayer constamment de définir la valeur d’une colonne sur l’agrégat d’une autre colonne (ce qui viole le principe d’éviter de stocker des données redondantes), vous pouvez utiliser un CTE (expression de table commune) - consultez <a href="http://technet.microsoft.com/en-us/library/ms190766.aspx">ici</a> et <a href="https://sqlblog.org/2016/01/06/s1-backtobasics-ctes">ici</a> pour plus de détails :</p>
<pre><code class="lang-auto">;WITH t2 AS
(
SELECT [key], CalculatedColumn = SUM(some_column)
FROM dbo.table2
GROUP BY [key]
)
UPDATE t1
SET t1.CalculatedColumn = t2.CalculatedColumn
FROM dbo.table1 AS t1
INNER JOIN t2
ON t1.[key] = t2.[key];
</code></pre>
<p>La raison pour laquelle c’est peu judicieux, c’est que vous allez devoir réexécuter cette mise à jour entière à chaque fois qu’une ligne dans <code>table2</code> change. Un <code>SUM</code> est quelque chose que vous pouvez toujours calculer au moment de l’exécution et, ce faisant, vous n’avez jamais à vous soucier que le résultat soit obsolète.</p>