2015-07-12 140 views
-2

嗨我想更新列的某些值,可以更新過程中更改。例如如何使用更改值更新表

1: select * into #TempTable from (values ('a', 1), ('b', 1)) t (code, num) 
2: select * from #TempTable 
3: update tt set tt.code = 'b', tt.num = (
    select max(oo.num) + 1 from #TempTable oo where oo.code = 'b') 
    from #TempTable tt 
4: select * from #TempTable 
5: drop table #TempTable 

聲明2的輸出:是

code num 
---- --- 
a 1 
b 1 

和語句4:是

code num 
---- --- 
b 2 
b 2 

似乎如果UPDATE語句是靜態如,導致兩個 'B' 與NUM 2.我真正想要實現的是列號將通過整個UPDATE語句更改其值,即對於語句4:我預計輸出爲

code num 
---- --- 
b 2 
b 3 

你如何編寫查詢來實現?我想避免使用遊標,因此不依賴遊標的答案將被挑選出來。如果沒有遊標是不可能的,那麼只有使用遊標的答案纔會被選中。謝謝。

+0

如果沒有光標作爲一般要求,這是不可能的。從概念上講,SQL更新「同時發生」。 「萬聖節保護」的概念就是確保在現實世界的執行計劃中不會發生這種情況。對於某些特定類型的要求 - 例如運行總計,但是可以使用窗口函數來得到相同的結果。 –

回答

-1
;WITH CTE AS (
SELECT Code 
    , Num 
    , Num + ROW_NUMBER() OVER (ORDER BY Num ASC) rn 
FROM #TempTable) 
UPDATE CTE 
    SET Code = 'b' 
    ,Num = rn 
+0

對不起,我把你的代碼放到我上面的例子中,它仍然給出了兩個'b',2 – user1589188

+0

立即嘗試@ user1589188(而不是投票的人試圖幫助你,你應該幫助他們提供適當的反饋和更多的信息來幫助你) –

+0

謝謝你的嘗試,但你的答案是人爲的,你的問題錯了。您只需預先選擇2和3,然後將num列更新爲2和3.我的問題是關於將列更新爲正在改變整個更新的值。 – user1589188

相關問題