2017-01-13 3 views
1

У меня есть два заявления обновления, которые мы запускаем на сервере SQL они, какДва обновления на одном операторе

UPDATE dbo.c_Account 
SET Ct = Ct-1 
Where 
Acc = 'IT' OR Acc = 'gt' 

UPDATE dbo.c_Account 
SET Ct = Ct-3 
Where 
Acc = 'ABC' 

Есть ли возможность делать как обновление на одном заявлении

+1

звук как сазе –

+0

Вы пытаетесь уменьшить код? Увидеть проблему производительности? – dfundako

+0

@dfundako Я новичок в SQL-сервере и запросы Я могу сделать их по-отдельности, но не уверен, что только один оператор может делать оба: – trx

ответ

8

Вы могли бы объединить это нравится:

UPDATE t SET 
    Ct = Ct - CASE WHEN t.Acc IN ('IT','gt') THEN 1 ELSE 3 END 
FROM dbo.c_Account t 
WHERE t.Acc IN ('IT','gt','ABC') 

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

0
UPDATE dbo.c_Account 
SET Ct = case 
when (Acc = 'IT' OR Acc = 'gt') then Ct-1 
When Acc = 'ABC' then Ct-3 
Else ct 
End 

Выше будет обновлено все записи по умолчанию, не меняющиеся. Вы можете добавить статут, чтобы обновить только те, которые вам нужны, например. Где акк в ('IT', 'Gt', 'ABC')

+1

Это обновит каждую запись. – HLGEM

+1

Хотя это даст вам правильный результат, это также может привести к массивной операции, если таблица имеет 100 000 000 строк. – dfundako

+0

Согласен, это должно было продемонстрировать, как это можно достичь. Я опубликовал перед добавлением комментария с предложением where (все еще находя свой путь вокруг stackoverflow :)) – user7415753

1
 UPDATE dbo.c_Account 
    SET Ct = case Acc when 'IT' then (Ct-1) 
    when 'GT' then ct-1 
    when 'abc' then ct-3 
    else ct 
    end 

    WHERE t.Acc IN ('IT','gt','ABC') 
+0

благодарит много за исправление ... –

+0

я получу очки за этот ответ? –

+0

Вы получаете очки, когда ваш ответ встает на голосование или получает отметку в качестве принятого ответа лицом, отправившим вопрос. – dfundako

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