Select from update, туплю-торможу, помогите, пожалуйста

Безрукая мастерица
Дата: 22.10.2015 16:57:02
Добрый вечер.
Есть запрос вида
with t as (select id, zz from table_1 where [conditions])
select id, t2.things from table_2 t2 join t using (id)
where zz = 1
and t2.things is null

При его помощи надо проапдейтить таблицу table_2, поле things по полученным записям.
Знаю, что есть некий select from update, но доселе пользоваться им не приходилось.
Если возможно, напишите пример для представленного мной случая, если нет, то дайте ссылочку на описание, пожалуйста.
Гугл предоставил мне пару ссылок на документацию, но моих мозгов не хватило, чтобы как следует разобраться и написать, везде ошибка синтаксиса.
Заранее спасибо.
Elic
Дата: 22.10.2015 17:02:38
Безрукая мастерица
надо проапдейтить таблицу table_2, поле things
Чем?
Безрукая мастерица
Знаю, что есть некий select from update
Тебе показалось. RTFM MERGE
Безрукая мастерица
Дата: 22.10.2015 17:08:35
Elic
Чем?

Значением поля things из t.
Elic
Тебе показалось. RTFM MERGE

Получается, это не Oracle, а какая-то другая СУБД такую возможность имеет?
Странно, я других СУБД не знаю, но совершенно точно такая конструкция есть, даже поисковики предложили что-то подобное.
ArtNick
Дата: 22.10.2015 17:12:47
Безрукая мастерица
Получается, это не Oracle, а какая-то другая СУБД такую возможность имеет?
Странно, я других СУБД не знаю, но совершенно точно такая конструкция есть, даже поисковики предложили что-то подобное.

Может
select for update
? тогда огорчу, он только блокировки накладывает.
Elic
Дата: 22.10.2015 17:13:07
Безрукая мастерица
things из t.
Ты её видишь? Я - нет.
Безрукая мастерица
возможность
Ещё раз: MERGE
miksoft
Дата: 22.10.2015 17:13:40
Безрукая мастерица
Знаю, что есть некий select from update
Может, речь про SELECT ... FOR UPDATE ?
Вот только он таблички не апдейтит...
stax..
Дата: 22.10.2015 17:16:49
Безрукая мастерица,

for update не меняет данные/таблицу, он токо выставляет блокировку

если я понял вопрос, то

update table_2 t2 set t2.things='xxx'
where t2.things is null
and exists (
 with t as (select id, zz from table_1 where [conditions])
 select 1 from t whre t.id=t2.id and zz=1)


.....
stax
Безрукая мастерица
Дата: 22.10.2015 17:24:28
Вопрос разрешился.
Один из коллег подсказал, что возможность апдейтить из запроса есть то ли в Терадате, то ли еще где, но не исключено, что мне попался такой код и запомнился.
В Oracle надо использовать Merge. Спасибо, Elic, за первый и правильный ответ.

stax.., в моем коде ошибка, не хватает поля things в t.
Надо апдейтить поле таблицы тем, что пришло из t.

Всем спасибо еще раз, решение найдено.
Добрый Э - Эх
Дата: 22.10.2015 17:27:25
Безрукая мастерица,

тебе нужно обновляемое представление на основе джойна таблиц-приемника с таблицей источником (update (select ... from t1 join t2 ...) v set ... )?
Такое есть и даже работать будет. Но либо при условии сохранения ключа обновляемой таблицы, либо при выворачивании рук ораклу посредством недокументированного хинта (не работает с версии 10.2.0.4 кажись)
При версии оракла 9iR2 и выше имеет смысл, как уже сказали раньше, использовать MERGE
остальное уже помянули
Дата: 22.10.2015 17:32:41
Безрукая мастерица
Один из коллег подсказал, что возможность апдейтить из запроса есть то ли в Терадате, то ли еще где
не селект фром апдейт, а апдейт фром селект, и не только в терадате, но в мсскл, постгресах и т.п.
При определенных условиях может удовлетворить банальный
update ... set ... = (коррелированный селект) where ...