2016-12-08 66 views
1

我想用簡單的case語句更新表中的字段。但是,我只想將此case語句應用於選定的行數。我確定這些行的唯一方法是加入另一個表,然後根據第二個表中的字段獲得一些條件。SQL Server更新表1與表2中的條件

例如,這是我認爲這是可行的......

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') 

然而,似乎一個人不能有這樣的更新語句內加入。至少不在MS SQL中。

我試過尋找一個答案,但我可以找到的是人們試圖更新表中的數據從另一個表中包括一個連接,從而將一個「從」聲明我的連接,然後嵌套選擇聲明與內部的聯接。我不確定這是否是我的解決方案。我不想從另一個表中更新,我想根據另一個表進行過濾。

我現在能想到的唯一解決方案是兩個查詢解決方案,首先檢索obj_id s列表,然後在第二個更新語句中僅選擇這些id。不理想。

+0

它需要一個FROM子句? – 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子句中的第二個表格......但是原始表格未被過濾,因此我將更新所有行,這絕對不是我所要做的想。但我想這種行爲與聽起來不同。 – Luke

+1

@Luke。 。 。 '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語句JOIN在SQL Server

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')