這是我的第一篇文章!忍受着我。 我有一個更新聲明,我想了解SQL Server如何處理它。更新表設置字段
UPDATE a
SET a.vField3 = b.vField3
FROM tableName a
INNER JOIN tableName b on a.vField1 = b.vField1
AND b.nField2 = a.nField2 – 1
這是我的查詢以其最簡單的形式。
vField1 is a Varchar
nField2 is an int (autonumber)
vField3 is a Varchar
我已經離開了WHERE子句,所以明白了邏輯,否則會使得這個nessessity。
說vField1是客戶編號,客戶有3個記錄 nField2中的值是1,2和3連續。 vField3是一個狀態
當更新來a.nField2 = 1沒有a.nField2 -1所以它繼續 當更新來a.nField2 = 2,b.nField2 = 1 當更新到a.nField2 = 3,b.nField2 = 2
因此,當更新是在a.nField2 = 2上,別名b反映了先前行上的內容(b.nField2 = 1) 而且它SET a.vField3的Varchar值= b.vField3
當更新位於a.nField2 = 3時,別名b反映了先前行上的內容(b.nField2 = 2) 而且它(應該)設置a.vField3 = b.vField3的Varchar值
當過程完成時 - 三條記錄中的第二條記錄與預期相符 - 第二條記錄的vField3中的值反映第一條記錄中vField3的值
但是,第三條記錄的vField3並不反映第二條記錄中vField3的值。
我認爲這表明SQL Server可能正在生成某種事務然後進行更新。
問題:如何在每次事務後獲得數據庫更新,以便我可以引用每個事務生成的值?
謝謝。 davlyo
「但是,第三條記錄的vField3不反映第二條記錄中vField3的值。」你得到了什麼?你是指第二個記錄的新值或原始值? – mdma 2010-06-09 21:58:34
你從完全錯誤的角度出發,根據遊標而不是邏輯集合操作來思考 - 閱讀一本書並挖掘其中的差異,但不用擔心,對於第一個處理SQL的程序員來說,這是一個非常常見的缺陷時間。 – Cruachan 2010-06-09 22:23:15
我認爲「tablename a」和「tablename b」實際上是2個不同的表,而不是一個具有兩個不同別名的表? (這會使它成爲一個自連接,而且毫無意義) – BradC 2010-06-09 22:28:23