Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > переписать запрос


Автор: andriy89 10.4.2012, 23:02
Добрый день. Помогите пожалуйста переделать запрос так, чтобы он срабатывал и на SQL Server и на Oracle.

Код

UPDATE t1
SET t1.col1 = t2.col1, t1.col2 = t2.col2
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id


p.s. сам надумал только вот такого плана:

Код

UPDATE (SELECT col1, col2 
         FROM table1 t1 
         JOIN table2 t2 ON t1.id = t2.id) t3 
SET t3.col1 = t2.col1, t3.col2 = t2.col2

Автор: Akina 11.4.2012, 08:22
Код

UPDATE t1, t2
SET t1.col1 = t2.col1, t1.col2 = t2.col2
WHERE t1.id = t2.id

Автор: Zloxa 11.4.2012, 09:27
Akina, оракл вообще не умеет жойн в апдейте, делите

В оракле применяют либо тот подход, который использовал ТС, либо
Код

update tab1 t1
  set (col1,col2) = (select col1,col2 from tab2 t2 where t1.id = t2.id)
  where id in (select id from tab2)


Цитата(andriy89 @  11.4.2012,  00:02 Найти цитируемый пост)
только вот такого плана:

нормально smile 
только синтаксически не корректно и на MS SQL 2к у мну не получилось такой подход исопльзовать. smile 

Может посмотреть в сторону merge? Ваша версия MSSQL его потдерживает?

Код

merge into tab1 t1
  using (select t2.* from tab2 t2
         --inner join tab1 t1 on t1.id = t2.id
        ) t2
  on (t1.id = t2.id)
  when matched then update set t1.col1 = t2.col1
                               ,t1.col2 = t2.col2
  --when not matched then insert (id) values (null)

* коментарии убрать для совместимости с 9й версией оркала

Автор: andriy89 11.4.2012, 19:24
merge использовать не желательно smile

а что с синтаксической точки зрения неправильно в моей второй версии ?

Автор: Zloxa 12.4.2012, 08:35
Цитата(andriy89 @  11.4.2012,  20:24 Найти цитируемый пост)
а что с синтаксической точки зрения неправильно в моей второй версии ? 

1) col1, col2 в подзапросе не одназначно трактуются. Не понятно должны ли они быть возвращены из множетсва t1 или же t2
2) алиас t2 не может быть использован вне подзапроса t3

Если бы вы хоть попытались запустить этот подзапрос, вам то же самое расказал бы синтаксический анализатор.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)