他のテーブルとの結合を作成してテーブル内の列を更新したい。例:
UPDATE table1 a
INNER JOIN table2 b ON a.commonfield = b.[common field]
SET a.CalculatedColumn= b.[Calculated Column]
WHERE
b.[common field]= a.commonfield
AND a.BatchNO = '110'
しかし、不満を述べています。
メッセージ 170、レベル 15、状態 1、行 2
行 2: 'a' 付近の構文が正しくありません。
ここで何が問題なのでしょうか?
ベストアンサー1
SQL Server の独自の構文をまだよく理解していません。また、結合して後でフィルターするUPDATE FROM
必要がある理由もよくわかりません。次を試してください。CommonField
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';
常に1つの列の値を別の列の集計に設定しようとするなど(冗長なデータの保存を避けるという原則に違反する)、CTE(共通テーブル式)を使用できます。ここそしてここ詳細については:
;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];
これが馬鹿げている理由は、行が変更されるたびに、この更新全体を再実行する必要があるからですtable2
。A はSUM
実行時に常に計算できるものであり、そうすることで、結果が古くなることを心配する必要がなくなります。