2016-12-08 12 views
1

テーブルのフィールドを単純なcaseステートメントで更新したいと考えています。しかし、私はこのケース文を選択された数の行に適用したいだけです。私がこれらの行が何であるかを判断する唯一の方法は、別のテーブルに参加し、その2番目のテーブルのフィールドに基づいていくつかの条件を設定することです。SQL Serverの更新表2の条件付きテーブル1

例えば、これは...私はそれが仕事だろうと思ったか

update table1 
set table1.field1 = case 
    when table1.field1 = 'foo' then 'bar' 
    else 'foobar' 
end 
join table2 on table1.obj_id=table2.id 
where table2.field1 = 'fizzbuzz' 
and table2.field2 in ('foo', 'bar', 'foobar') 

あるしかし、それは1つが、このような更新ステートメントの内側に参加することはできませんようです。少なくともMS SQLではありません。

私は答えを検索しようとしましたが、私が見つけることができるのは、結合を含む別のテーブルのデータでテーブルを更新しようとする人です。その中にジョインされたステートメント。私はこれが私にとっての解決策であるとは確信していません。私は別のテーブルから更新したくない、別のテーブルに基づいてフィルタをかけたい。

ここで私が考えることができる唯一の解決策は、最初にobj_idのリストを取得し、次に2番目の更新ステートメントでこれらのIDだけを選択するという2つのクエリソリューションです。理想的ではない。

+0

はそれがFROM句必要ないSQL ServerでのUPDATE文でJOINを使用することができますか? – McNets

+0

"しかし、このような更新ステートメントの中で結合を行うことはできないようですが、MS SQLでは少なくともありません。 。これはそうではありません。 – AK47

答えて

2

できます。構文はfromが必要です。

update t1 
    set field1 = (case when t1.field1 = 'foo' then 'bar' else 'foobar' end) 
    from table1 t1 join 
     table2 t2 
     on t1.obj_id = t2.id 
    where t2.field1 = 'fizzbuzz' and 
      t2.field2 in ('foo', 'bar', 'foobar'); 
+0

これは間違いなく私が望むことをするでしょうか?それは私のように聞こえる私は更新する元のテーブルを持っているだろうし、from句の2番目のテーブル...元のテーブルがフィルタリングされないように私は間違いなく私はすべての行を更新されます欲しいです。しかし、私はその振る舞いが、それが聞こえるようなものとは違うと思う。 @Luke。 – Luke

+1

。 。 't1'は更新したいテーブルのテーブルエイリアスです。 'update'に一貫してテーブルエイリアスを使い、完全に形成されたテーブルロジックを' from'節に入れておくことを強くお勧めします。これにより、更新が何をするかを確認するために 'select'に変換する方がずっと簡単です。 –

2
update t1 
set field1 = case 
    when t1.field1 = 'foo' then 'bar' 
    else 'foobar' 
end 
from table1 t1 
join table2 t2 on t1.obj_id=t2.id 
where t2.field1 = 'fizzbuzz' 
and t2.field2 in ('foo', 'bar', 'foobar'); 
3

我々は

update t1 
    set t1.field1 = case 
     when t1.field1 = 'foo' then 'bar' 
     else 'foobar' 
    end 
    from table1 t1 
    inner join table2 on t1.obj_id=table2.id 
    where table2.field1 = 'fizzbuzz' 
    and table2.field2 in ('foo', 'bar') 
関連する問題