私はこの結合を持っています:
UPDATE Table_Name
SET Change = isnull(tab2.Value,0) - tab1.Value
FROM
(SELECT Date,ID,ID,FileName,Value FROM Table_Name WHERE FileName = 'x' AND Date = '2012-05-17') tab1
LEFT OUTER JOIN
(SELECT Date,ID,TradeID,FileName,Value FROM Table_Name WHERE FileName = 'x' AND Date = '2012-05-18') tab2
ON tab1.FileName = tab2.FileName AND
tab1.ID = tab2.ID AND
tab1.ID = tab2.ID
ご覧のとおり、これは左外部結合です。ただし、5 月 17 日のデータがあり、5 月 18 日のデータがない場合、挿入される値は -17th.Value である必要があります (一般的な計算は 18th.Value - 17th.Value および 18th.Value がゼロになるため)。
(デバッグ用に)挿入部分のすぐ下にselectステートメントを配置すると、これは正しく表示されますが、SELECTステートメントを削除してSET部分で計算を行うと、機能しません。最終的に、5 月 18 日の一致が見つからなかった null の変更の値になります。
編集:LEFT JOINまたはLEFT OUTER JOINが必要かどうかわからないことを追加する必要があります。tab1 からすべての行を返したいのですが、それが tab2 に存在しない場合、変更値は、tab2.Value - tab1.Value ではなく、-tab1.Value にする必要があります。