2013-09-25 2 views
4

Это обычный SQL-запрос для меня:Использование подзапроса в обновлении всегда требует подзапроса в предложении where?

update table1 set col1 = (select col1 from table2 where table1.ID = table2.ID) 
where exists (select 1 from table2 where table1.ID = table2.ID) 

Есть ли способ, чтобы избежать два почти идентичных подзапросов? Этот запрос является очевидным упрощением, но производительность страдает, и запрос бесполезен для чтения.

ответ

4

К сожалению Informix не поддерживает ЕК в UPDATE заявление. Способ обхода проблемы и вы получите лучшие результаты (производительность) - это изменение инструкции UPDATE to MERGE.

Это будет работать только, если база данных версии 11,50 или выше

MERGE INTO table1 as t1 
USING table2 as t2 
    ON t1.ID = t2.ID 
WHEN MATCHED THEN UPDATE set (t1.col1, t1.col2) = (t2.col1, t2.col2); 

Проверить IBM Informix manual для получения дополнительной информации

+0

Я этого не знал. Это довольно круто. –

+0

Привет @Filipe, это не только Informix, оракул и SqlServer тоже поддерживают это утверждение. Проверьте синтаксис, и вы обнаружите, что вы можете работать со вставкой + обновлением или вставить + удалить в том же самом заявлении. – ceinmart

+0

Работала так, как ожидалось. Большой! – Nezreli

-1

попробовать это:

update table1 set col1 = (select col1 as newcol from table2 where table1.ID = table2.ID) 
where exists (newcol) 
+0

Этот запрос не работает. Я получил синтаксическую ошибку. – Nezreli

0

Update с внутренним соединением может быть использован, чтобы избежать подзапросов

что-то вроде этого:

update t1 
set col1 = t2.col1 
from table1 t1 
inner join table2 t2 
on t1.ID = t2.ID 
+0

Этот запрос также не работает. Я получил синтаксическую ошибку. – Nezreli

+0

Попробуйте с псевдонимом t1 в таблице1 в предложении from. Я отредактировал ответ. –

+0

Без изменений. Просто уточнить, что я использую базу данных Informix, если вы пропустили тег. Благодарю. – Nezreli

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