2011-04-25 5 views

ответ

16

Вы можете просто объединить обновления с сазом такого

UPDATE records 
    SET name = 
    CASE 
     WHEN id = 3 THEN 'abc' 
     WHEN id = 1 THEN 'def' 
     ELSE name 
    END 
+2

Я думаю, что у вас должно быть 'where', но в противном случае оно будет делать обновление для всех записей в таблице. – Guffa

+0

@Guffa У вас есть действительная точка, и я согласен с предложением 'where'. Недостатком этого является то, что мы должны убедиться, что условия в 'case' и' where' одинаковы. Конечно, мое решение обновляет все строки, но для строк, которые не подпадают под эти условия, они обновляются от 'name' до' name', что, очевидно, ничего не меняет –

+5

В большинстве случаев это ничего не меняет, но представьте, что есть триггер обновления, который записывает все измененные строки в другую таблицу ... – Guffa

5
;WITH vals(id, name) 
    AS (SELECT 3,'abc' 
     UNION ALL 
     SELECT 1,'def') 
UPDATE r 
SET name = vals.name 
FROM records r 
     JOIN vals 
     ON vals.id = r.id 
+0

Спасибо, выполнил мою работу из этого запроса. –

16

всего несколько записей, вы можете использовать:

update records 
set name = case id 
    when 1 then 'def' 
    when 3 then 'abc' 
end 
where id in (1, 3) 

немного более гибок, чтобы создать результат, который вы можете присоединиться в обновление:

update r 
set name = x.name 
from records r 
inner join (
    select id = 1, name = 'abc' union all 
    select 3, 'def' union all 
    select 4, 'qwe' union all 
    select 6, 'rty' 
) x on x.id = r.id 
+0

Блестящий! Благодаря! –

+2

Почему downvote? Если вы не объясните, что это такое, что вы считаете неправильным, оно не может улучшить ответ. – Guffa

+0

Это должен быть принятый ответ. –

3

Стандарт SQL: 2003 синтаксис (работает на SQL Server 2008 и выше):

MERGE INTO records 
    USING (
      VALUES (1, 'def'), 
       (3, 'abc') 
     ) AS T (id, name) 
     ON records.id = T.id 
WHEN MATCHED THEN 
    UPDATE 
     SET name = T.name; 

Обратите внимание, что NAME и RECORDS - зарезервированные слова SQL.

Смежные вопросы