回答:
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
は、実行時に常に計算できるものであり、そうすることで、結果が古くなることを心配する必要はありません。
UPDATE t1 INNER JOIN t2 on t2.col = t1.col SET t1.field=value WHERE t2.col=something
。
このようにしてみてください:
begin tran
UPDATE a
SET a.CalculatedColumn= b.[Calculated Column]
FROM table1 a INNER JOIN table2 b ON a.commonfield = b.[common field]
WHERE a.BatchNO = '110'
commit tran
上記のAaronによる回答は完璧です。
UPDATE a
SET a.CalculatedColumn = b.[Calculated Column]
FROM Table1 AS a
INNER JOIN Table2 AS b
ON a.CommonField = b.[Common Field]
WHERE a.BatchNo = '110';
テーブルの更新中にテーブルのエイリアスを使用しようとすると、SQL Serverでこの問題が発生する理由を追加したいだけです。以下の構文では常にエラーが発生します。
update tableName t
set t.name = 'books new'
where t.id = 1
単一のテーブルを更新する場合、または結合を使用して更新する場合は、大文字と小文字が区別されます。
上記のクエリはPL / SQLでは正常に機能しますが、SQL Serverでは機能しません。
SQL Serverでテーブルエイリアスを使用しているときにテーブルを更新する正しい方法は次のとおりです。
update t
set t.name = 'books new'
from tableName t
where t.id = 1
エラーがここに来た理由がみんなに役立つことを願っています。
SQL Server 2012はTeradataの古い更新構文も処理できるようです。
UPDATE a
SET a.CalculatedColumn= b.[Calculated Column]
FROM table1 a, table2 b
WHERE
b.[common field]= a.commonfield
AND a.BatchNO = '110'
私の記憶が正しければ、同様のクエリを実行すると2008R2でエラーが発生しました。
UPDATEをSELECTにして、更新する前にテストとして更新したい行を取得すると便利です。必要な行を正確に選択できる場合は、更新する行だけを更新できます。
DECLARE @expense_report_id AS INT
SET @expense_report_id = 1027
--UPDATE expense_report_detail_distribution
--SET service_bill_id = 9
SELECT *
FROM expense_report_detail_distribution erdd
INNER JOIN expense_report_detail erd
INNER JOIN expense_report er
ON er.expense_report_id = erd.expense_report_id
ON erdd.expense_report_detail_id = erd.expense_report_detail_id
WHERE er.expense_report_id = @expense_report_id
別のアプローチはMERGEを使用することです
;WITH cteTable1(CalculatedColumn, CommonField)
AS
(
select CalculatedColumn, CommonField from Table1 Where BatchNo = '110'
)
MERGE cteTable1 AS target
USING (select "Calculated Column", "Common Field" FROM dbo.Table2) AS source ("Calculated Column", "Common Field")
ON (target.CommonField = source."Common Field")
WHEN MATCHED THEN
UPDATE SET target.CalculatedColumn = source."Calculated Column";
-MergeはSQL標準の一部です
-また、内部結合の更新が非決定的であると確信しています。ここで同様の質問があり、回答はそのhttp://ask.sqlservercentral.com/questions/19089/updating-two-tables-using-single-queryについて語ってい ます。 html
MERGE
ます。
上記のアーロンのアプローチは私にとって完璧に機能しました。1つのテーブルで連結された2つのフィールドに基づいて結合し、別のテーブルのフィールドと一致させる必要があったため、更新ステートメントは少し異なりました。
--update clients table cell field from custom table containing mobile numbers
update clients
set cell = m.Phone
from clients as c
inner join [dbo].[COSStaffMobileNumbers] as m
on c.Last_Name + c.First_Name = m.Name
試してください:
UPDATE table1
SET CalculatedColumn = ( SELECT [Calculated Column]
FROM table2
WHERE table1.commonfield = [common field])
WHERE BatchNO = '110'
table1
ます。
BatchNo = '110'
ですか?この影響の結果としてすべての反対投票が行われたのですか、それとも他の反対投票の理由があったのですか?
NULL
もいるだろうし、この形式はT-SQL固有のソリューションではないかもしれないので、私は尋ねます。
UPDATE table1 a SET a.[field] = b.[field]
-エイリアスを削除しても機能するのでUPDATE table1 a SET [field] = b.[field]