Вот полный пример того, как это можно сделать.
Однако вам нужны привилегии запроса на флэшбэк для дочерней таблицы.
Вот настройки.
create table parent_tab
(parent_id number primary key,
val varchar2(20));
create table child_tab
(child_id number primary key,
parent_id number,
child_val number,
constraint child_par_fk foreign key (parent_id) references parent_tab);
insert into parent_tab values (1,'Red');
insert into parent_tab values (2,'Green');
insert into parent_tab values (3,'Blue');
insert into parent_tab values (4,'Black');
insert into parent_tab values (5,'White');
insert into child_tab values (10,1,100);
insert into child_tab values (20,3,100);
insert into child_tab values (30,3,100);
insert into child_tab values (40,4,100);
insert into child_tab values (50,5,200);
commit;
select * from parent_tab
where parent_id not in (select parent_id from child_tab);
Теперь удалите подмножество детей (с родителями 1,3 и 4 - но не с 5).
delete from child_tab where child_val = 100;
Затем получите parent_ids из текущего состояния COMMITTED child_tab (т.е. как они были до ваших удалений) и удалите те, которые ваш сеанс НЕ удалил. Это дает вам подмножество, которые были удалены.
Затем вы можете удалить их из parent_tab
delete from parent_tab
where parent_id in
(select parent_id from child_tab as of scn dbms_flashback.get_system_change_number
minus
select parent_id from child_tab);
«Зеленый» все еще там (поскольку у него все равно не было записи в дочерней таблице), а «Красный» все еще там (так как у него все еще есть запись в дочерней таблице)
select * from parent_tab
where parent_id not in (select parent_id from child_tab);
select * from parent_tab;
Это экзотическая / необычная операция, поэтому, если бы я делал это, я, вероятно, был бы немного осторожен и заблокировал дочерние и родительские таблицы в эксклюзивном режиме в начале транзакции. Кроме того, если бы дочерняя таблица была большой, она не была бы особенно производительной, поэтому я бы выбрал решение PL / SQL, как у Раджеша.