синтаксис sql для запроса на обновление с подключением по предыдущему

Начинаю работать с sql и столкнулся с иерархическими запросами. тем временем мне удалось выбрать строки с помощью команды connect by prior, но не удалось обновить. Вот мой запрос на обновление:

update HTABLE set status = 'INACTIVE'
  WHERE STATUS <> 'CLOSE'
  Connect by prior PARENT_ID=ID start with PARENT_ID=12345;

Я получил SQL Error: ORA-00933: SQL command not properly ended и буду рад узнать, как обновить таблицу, используя иерархию..

Спасибо!

ИЗМЕНИТЬ Я также пытался поместить условие where в start with, не помогает:

update HTABLE set status = 'INACTIVE'
  Connect by prior PARENT_ID=ID start with PARENT_ID=12345 AND STATUS <> 'CLOSE';

person AsfK    schedule 25.07.2017    source источник


Ответы (2)


Иерархический запрос работает только с SELECT. Это не работает с ОБНОВЛЕНИЕМ (я согласен, что это было бы здорово, если бы это было так).

Итак, что вы можете сделать, это:

update HTABLE 
set status = 'INACTIVE'
WHERE STATUS <> 'CLOSE'
and id in ( select c.id
            from htable
            connect by prior ID = PARENT_ID 
            start with PARENT_ID = 12345);

Обратите внимание на порядок столбцов connect by prior ID = PARENT_ID. Обычно мы хотим идти вниз по дереву от строки START WITH, что я и сделал. Ваш порядок connect by prior PARENT_ID = ID идет вверх по дереву от 12345 до его родителей, бабушек и дедушек и т. д. Если это то, что вы хотите, переключите предложение connect by обратно.

person APC    schedule 25.07.2017

Вы можете обновить с помощью пункта where id in (select ... connect by...) или вы можете использовать merge:

merge into htable h
using (select distinct id 
         from htable 
         where status <> 'CLOSE'
         connect by prior parent_id = id 
         start with parent_id = 11) src
on (h.id = src.id)
when matched then update set status = 'INACTIVE'

Данные испытаний:

create table htable (id number(4), parent_id number(4), status varchar2(10));
insert into htable values (   1, null, 'ACTIVE');
insert into htable values (  11,    1, 'CLOSE');
insert into htable values (  12,    1, 'ACTIVE');
insert into htable values ( 111,   11, 'ACTIVE');
insert into htable values ( 112,   11, 'ACTIVE');
insert into htable values ( 121,   12, 'ACTIVE');
insert into htable values (   2, null, 'ACTIVE');
insert into htable values (  21,    2, 'ACTIVE');
insert into htable values ( 211,   21, 'ACTIVE');
insert into htable values ( 212,   21, 'ACTIVE');

и после merge:

   ID PARENT_ID STATUS
----- --------- ----------
    1           INACTIVE
   11         1 INACTIVE
   12         1 ACTIVE
  111        11 INACTIVE
  112        11 INACTIVE
  121        12 ACTIVE
    2           ACTIVE
   21         2 ACTIVE
  211        21 ACTIVE
  212        21 ACTIVE
person Ponder Stibbons    schedule 25.07.2017