2010-05-27 68 views
1
UPDATE TableA 
SET Value = a.Value * b.AnotherValue 
FROM TableA AS a 
INNER JOIN TableB AS b 
WHERE (Condition is true); 

這是問題所在。 TableA的值字段不允許空值。如果a.Value * b.AnotherValue的計算結果爲null,則會引發錯誤。現在是問題。當計算結果爲空並且刪除記錄而不是更新記錄時,有什麼辦法可以告訴UPDATE忽略SET階段嗎?此UPDATE旨在一次更新數百條記錄,但如果遇到單個空值將會失敗。另外,請注意使用ISNULL()函數並將值設置爲零是不可接受的。如果遇到null,我希望該記錄被刪除。非常感謝提供任何幫助。Nulls和UPDATE語句的問題

+0

您的INNER JOIN語句沒有「ON」子句。爲了清晰起見,我認爲它被忽略:) – 2010-05-29 04:10:25

回答

3

假設您的意思是在遇到空值時保持該值不變,「我希望在遇到空值時記錄被刪除」。

UPDATE TableA 
SET Value = isnull(a.Value * b.AnotherValue, a.value) 
FROM TableA AS a 
INNER JOIN TableB AS b 
WHERE (Condition is true); 

如果您確實想刪除行並正在使用SQL 2008或更高版本,請嘗試合併語句。

MERGE TableA AS target 
USING TableB as source ON (target.ID = Source.ID) 
WHEN MATCHED AND TableB.AnotherValue Is Null THEN DELETE 
WHEN MATCHED THEN UPDATE SET target.Value = Target.Value * Source.AnotherValue; 
+0

+1今天學到了一些新東西。 (使用MERGE來刪除)然而你的MERGE語句存在一些問題:1)'TableA'被別名爲'Target',但後來在多部分標識符中使用'TableA'('TableA.Id ')'TableB'不是別名,但後來使用'Source.AnotherValue'來代替'TableB.AnotherValue' – 2010-05-29 00:14:48

0

在更新期間無法刪除行,您需要兩條語句:刪除後跟更新。

0

這可以簡單地在兩個語句來完成:

UPDATE TableA 
SET Value = a.Value * b.AnotherValue 
FROM TableA AS a 
INNER JOIN TableB AS b 
WHERE (Condition is true) and (a.Value * b.AnotherValue) is not null; 

Delete a FROM TableA AS a 
INNER JOIN TableB AS b 
WHERE (Condition is true) and (a.Value * b.AnotherValue) is null; 

這是最簡單的解決方案。

如果情況沒有完全解決,您可以開始做更復雜的事情(交易,臨時表,MERGE等)。