#sql #oracle
#sql #Oracle
Вопрос:
Я получаю ошибку ORA-00928: отсутствует ключевое слово SELECT при использовании «обновить» с помощью «with».
Это выдает ошибку.
with wr_double as
(select...)
update work_request r
set r.name = r.name || '_old'
where exists
(select 1 from wr_double wd
where wd.name = r.name and wd.wr_id = r.id)
Но это работает нормально
with wr_double as
(select...)
select * from work_request r
where exists
(select 1 from wr_double wd
where wd.name = r.name and wd.wr_id = r.id)
Кроме того, если я помещу свой подзапрос из with в текст обновления, он будет работать нормально.
update work_request r
set r.name = r.name || '_old'
where exists
(select 1 from
(select
wr.name,
wr.id as wr_id,
dup_wr.count,
d.id as d_id,
d.create_date
from
(select...) wd
where wd.name = r.name and wd.wr_id = r.id)
Могу ли я не использовать «with» таким образом с «обновлением»?
Ответ №1:
вы должны написать ниже способ, потому что CTE является частью ВЫБОРА, а не ОБНОВЛЕНИЯ
update work_request
set name = name || '_old'
where exists (
with wr_double as
(select...)
select 1 from wr_double wd wd.name = work_request.name and wd.wr_id = work_request.id
);
Комментарии:
1. @Hopper — в документации говорится, что то, что делал fallingdog, разрешено; но это потому, что это документация MySQL, а не Oracle RDBMS. В Oracle CTE разрешен только как часть select (включая, как здесь, подзапрос).
2. @Zaynul — это сделало это! Спасибо!