我正在處理表中的 155 百萬行并分批執行以提高性能,但遇到了列中的值未按預期更新的情況。我知道我可以通過幾種不同的方式解決它,但我想看看是否有人知道如何在單個更新陳述句中做到這一點。
下面是一個測驗用例:
DECLARE @TempIds TABLE (
ColA int,
ColB int
)
--seed the values for a test
INSERT INTO @TempIds (ColA,ColB) VALUES (1, 2)
--do the update
UPDATE @TempIds SET ColA = (3 5), ColB = (1-ColA)
--see the results
SELECT * FROM @TempIds
上面的結果是:
ColA ColB
8 0
期望的結果是
ColA ColB
8 -7
更新陳述句在更新 ColB 時使用 ColA 的當前值為“1”,而不是使用 ColA 的最終值為“8”。
我知道我可以通過執行以下操作之一來解決此問題:
UPDATE @TempIds SET ColA = (3 5)
UPDATE @TempIds SET ColB = (1-ColA)
--see the results
SELECT * FROM @TempIds
OR
UPDATE @TempIds SET ColA = (3 5), ColB = 1-(3 5)
--see the results
SELECT * FROM @TempIds
上述任何一項都將導致以下輸出:
ColA ColB
8 -7
這是一個簡化版本,因為實際查詢有很多計算和公式來計算 ColA 的值。
我試圖避免兩個更新陳述句或需要在 ColB 公式中重復 ColA 的公式。
提前致謝!
uj5u.com熱心網友回復:
您是否可以通過首先創建一個新列 A 然后參考它來使用可更新 CTE:
with updateme as (
select *, (3 5) as NewA
from @TempIds
)
update updateme set colA = NewA, colb = 1-NewA;
select * from @TempIds;
uj5u.com熱心網友回復:
有可能使用變數。
DECLARE @newcola integer;
UPDATE @tempids
SET @newcola = cola = 3 5,
colb = 1 - @newcola;
db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/411907.html
標籤:
