It's not very well documented, but you can delete from a multitable inline view if the joins are supported by foreign key contraints, with the "child-most" (can't think of the right word for it) table being the target of the deletes. I think the syntactic benefits get better the more levels are involved.
SQL Fiddle here:
http://sqlfiddle.com/#!4/e0ea4/9 Demonstration:
create table parent (
id integer primary key,
value varchar2(30));
create table child (
id integer primary key,
parent_id references parent);
create table grandchild (
id integer primary key,
child_id references child);
insert into parent values (1,'a');
insert into parent values (2,'b');
insert into parent values (3,'c');
insert into child values (1,1);
insert into child values (2,2);
insert into child values (3,2);
insert into child values (4,3);
insert into child values (5,3);
insert into child values (6,3);
insert into grandchild values(1,1);
insert into grandchild values(2,1);
insert into grandchild values(3,3);
insert into grandchild values(4,3);
insert into grandchild values(5,3);
insert into grandchild values(6,6);
insert into grandchild values(7,6);
select count(*) grandchildren_before_delete
from parent join
child on (parent.id = child.parent_id) join
grandchild on (grandchild.child_id = child.id )
where parent.value = 'a';
delete from (
select *
from parent join
child on (parent.id = child.parent_id) join
grandchild on (grandchild.child_id = child.id )
where parent.value = 'a');
select count(*) grandchildren_after_delete
from parent join
child on (parent.id = child.parent_id) join
grandchild on (grandchild.child_id = child.id )
where parent.value = 'a';
delete from (
select *
from parent join
child on (parent.id = child.parent_id)
where parent.value = 'a');
select count(*) children_after_delete
from parent join
child on (parent.id = child.parent_id)
where parent.value = 'a';