2016-10-20 1 views
0

Ошибка при использовании «select case» для обновления таблицы.SQL-обновление с использованием оператора case case

Как нормальный выбор саз (не обновляется таблица) этот запрос работает отлично:

select case 
    when t1.id in (select t2.id from t2 where [condition1] then 'aaa' 
    when t1.id in (select t3.id from t3 where [condition2] then 'bbb' 
    when t1.id in (select t4.id from t4 where [condition3] then 'ccc' 
    else 'ddd' 
end 
from owner.t1; 

Однако, когда я пытаюсь использовать один и то же «выбери случай» заявление в операторе обновления я получаю ошибку констатирует Подзапрос возвращает более 1 ряд. Это запрос на обновление, что не работает:

update owner.t1 
set t1.var2 = 
(select case 
    when t1.id in (select t2.id from t2 where [condition1] then 'aaa' 
    when t1.id in (select t3.id from t3 where [condition2] then 'bbb' 
    when t1.id in (select t4.id from t4 where [condition3] then 'ccc' 
    else 'ddd' 
end 
from owner.t1); 

Когда я изменить код ниже, она работает, но на невероятно медленной скоростью. Возможно, слишком медленно для моей цели.

update owner.t1 
set t1.var2 = 
(select case 
    when t2.id in (select t2.id from t2 where [condition1] then 'aaa' 
    when t2.id in (select t3.id from t3 where [condition2] then 'bbb' 
    when t2.id in (select t4.id from t4 where [condition3] then 'ccc' 
    else 'ddd' 
end 
from owner.t2 
where t2.id = t1.id); 

Итак, мой вопрос в том, почему я должен ссылаться на свой идентификатор во вторичной таблице, а не на таблицу, которую я хочу обновить? И эта дополнительная проверка в выражении «где» добавляет много дополнительного времени на операцию?

+0

Ваш первый запрос на обновление не должен вызывать эту ошибку, потому что вы используете 'IN'. Можете ли вы отправить оригинальный запрос –

ответ

0

Почему бы просто не сделать это?

update owner.t1 
    set t1.var2 = (case when t1.id in (select t2.id from t2 where [condition1] then 'aaa' 
         when t1.id in (select t3.id from t3 where [condition2] then 'bbb' 
         when t1.id in (select t4.id from t4 where [condition3] then 'ccc' 
         else 'ddd' 
        end); 
+0

Спасибо за предложение @Gordon. Это сработало и намного красноречивее, чем то, что я делал. Тем не менее, у меня все еще есть проблемы с временем, но я понял, что это просто к чистому нет. обновлений. – daragh