ORA-00928: отсутствует ключевое слово SELECT: обновить с помощью

#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 — это сделало это! Спасибо!