2016-04-14 42 views
1

我的基本問題與我的查詢中指定的值一次更新多個列有關。我想這樣做的原因是我正在更新我的ginormous表中的值,所以我只想查詢一次以減少運行時間。這裏是返回我想要的列只有一個值的例子select語句的一個例子,我需要更新:TSQL - 哪裏更新多列的聲明

select a.Value 
from Table1 
left outer join 
(
select ID, FilterCol1, FilterCol2, Value 
from Table2 
) a on a.ID = Table1.ID 
where {Condition1a on FilterCol1} 
and {Condition2a on FilterCol2} 

爲了一次我希望能夠更新多列做這樣的事情這個(但它返回NULL):

Update T1 
set T1Value1 = (select a.Value where {Condition1a on FilterCol1} 
and {Condition2a on FilterCol2) 
,T1Value2 = (select a.Value where {Condition1b on FilterCol1} 
and {Condition2b on FilterCol2}) 
from Table1 T1 
left outer join 
(
select ID, FilterCol1, FilterCol2, Value 
from Table2 
) a on a.ID = Table1.ID 

任何搞清楚了這一點,將不勝感激的幫助,讓我知道,如果你有任何問題,或者如果我犯了任何錯誤。謝謝!

編輯:我想我已經確定了這個問題,但我還不確定是否有解決方案。我認爲看到這個問題需要更多的上下文:表2中的選擇實際上是寬桌上的一個不透明選項。這意味着當應用left outer join時,給定ID將會有多行。伯爵建議的案例陳述似乎在做什麼(並且我認爲這也在where子句中發生)正在比較我的條件和僅來自a的列的第一行。由於我的條件有助於確定選擇了a中的哪些行,因此他們總是會爲第一行評估爲假(我知道這僅僅來自我對數據的瞭解),因此我的永久NULL值。有誰知道一個解決方法來看看a中的其他行嗎?

回答

0
UPDATE T1 
SET T1Value1 = CASE WHEN (FilterCol1 = Condition1a AND FilterCol2 = Condition2a) THEN a.Value END, 
    T1Value2 = CASE WHEN (FilterCol1 = Condition1b AND FilterCol2 = Condition2b) THEN a.Value END 

FROM Table1 T1 
left outer join 
     (
     select ID, FilterCol1, FilterCol2, Value 
     ) a on a.ID = Table1.ID 
+0

感謝您的回答伯爵,不幸的是這並沒有爲我工作(仍然返回null)。我想知道這是否會實際過濾將哪些值放入'T1ValueX'或過濾哪些行的Table1被更新。 「FilterCol(1,2)'是來自'Table2'的列,但是'Condition(1,2)(a,b,...)'正在查看'Table1'中的值嗎? –

+0

你可以添加表格和樣本數據嗎? – EarlOfEnnui

+0

WHERE子句將過濾更新的行。 CASE將選擇該值。如果您正確鏈接了表格的值,則無關緊要。鏈接表可能是剛接觸sql的人最容易被誤解的方面。我建議將來如果您有任何疑問,請添加一個表格和測試數據的創建。 – EarlOfEnnui