2016-04-14 18 views
1

私の基本的な質問は、クエリ内の指定された値から複数の列を一度に更新することです。私はこれをやりたいのですが、実行時間を短縮するために一度クエリを実行したいだけなので、私は大きなテーブルから値を更新しています。ここで私は私が更新する必要がある列の一つだけのために必要な値を返す例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 

いただければ幸いです。このうちを考え出すすべてのヘルプ、ご質問があれば私に知らせたり、私はすべてのエラーを行った場合。ありがとう!

EDIT:私はこの問題を特定したと思うが、解決方法はまだわからない。私は問題を見るにはもう少しの文脈が必要だと思います。テーブル2からの選択は、実際には広いテーブル上のピボットではありません。つまり、left outer joinが適用されると、特定のIDに対して複数の行が存在します。 Earlが提案したケースステートメントは何をしているように見えますか(これはwhere節でも起こっていると仮定しています)は、条件をaからの列の最初の行だけと比較しています。私の条件は、aからの行の選択を助けるためのものであるため、最初の行については常にfalseと評価されます(これは私がデータについて知っているところから知っているので、私の永久的な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

関連する問題