Обновление одной таблицы записями из другой одной командой

Hannibass
Дата: 22.03.2011 10:47:27
Новичёк. Не знаю, как корректно написать процедуру в ORACLE с помощью команды SQL Update.
Есть 2 таблицы: TAB(ID NUMBER, fld CHAR) и TAB_TMP(ID NUMBER, fld CHAR).
Вставку данных из таблицы TAB_TMP в таблицу TAB я сделал так:
INSERT INTO TAB(id,fld)
  	     (SELECT id,fld FROM TAB_TMP) ;
А теперь надо обновить данные в таблице TAB только в тех записях и теми данными , которые есть в таблице TAB_TMP (по ключу Id). Хотелось бы использовать команду UPDATE ... SELECT, или SELECT ... UPDATE. Т.е. Update c подзапроосом, но не знаю самого синтаксиса такой команды, не склеивается.Есть такая синтаксическая структура в ORACLE?
comphead
Дата: 22.03.2011 10:48:57
Hannibass,

откройте для себя MERGE
-2-
Дата: 22.03.2011 11:15:23
Hannibass
в таблице TAB_TMP (по ключу Id)
update (select ... key preserverd join)
Hannibass
Дата: 22.03.2011 11:24:29
comphead, спасибо за наводку. Буду копать в этом направлении.
Больше в Oracle нет аналогичных команд, ну или хотя бы , чтобы это можно было сделать с помощью 2 команд?
Hannibass
Дата: 22.03.2011 11:33:39
2 -2-
Не совсем понимаю синтаксис команды в данном примере ? Можно поподробнее?
Hannibass
Дата: 22.03.2011 11:54:29
-2-
Пропустит ли ORACLE следующее:
 UPDATE TAB
         SET (id,fld)=(SELECT id,fld FROM TAB_TMP)
         WHERE tab.id=tab_tmp.id ;
-2-
Дата: 22.03.2011 12:34:24
Hannibass,

update (select tbl.fld, tbl_tmp.fld new_fld from tbl join tbl_tmp using(id)) set fld=new_fld;
tbl_tmp.id должен иметь unique/primary key constraint
Hannibass
Дата: 22.03.2011 12:49:05
2 -2-
Вроде бы код понял, но обновляется ВЫБОРКА (SELECT...), а нужно обновить исходную таблицу TAB. Или я не полностью разобрался в коде?
upd
Дата: 22.03.2011 13:05:44
Hannibass,
UPDATE TAB
         SET (id,fld)=(SELECT id,fld FROM TAB_TMP WHERE tab.id=tab_tmp.id)
         where exists (SELECT 1 FROM TAB_TMP WHERE tab.id=tab_tmp.id) ;
Hannibass
Дата: 22.03.2011 13:38:47
upd, спасибо!
Твой код РАБОТАЕТ!
Ну и наверное подучу MERGE, выглядит код команды по-прозрачнее