2016-12-08 2 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, а затем выбрав только эти идентификаторы во втором операторе обновления. Не идеально.

+0

это нужно ЕКУ? – 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

Мы можем использовать JOIN в UPDATE заявлении в 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') 
Смежные вопросы