Това е почти това, което първични ключове и външни ключове и клаузи като ON DELETE CASCADE
са за. Ако не е твърде късно, можете да опитате да добавите PK и FK ограничения, преди да извършите изтривания; тогава всичко ще бъде лесно.
ДОБАВЕНО :Въз основа на допълнителна дискусия. Заявката по-долу може да се използва за намиране на всички наследствени таблици на родителска таблица. Заявката вероятно може да бъде подобрена по много начини, но може да е добра отправна точка.
with f as (
select constraint_name, table_name, r_constraint_name
from user_constraints
where constraint_type = 'R'
),
p as (
select constraint_name, table_name
from user_constraints
where constraint_type = 'P'
),
j (child_table, f_key, parent_table, p_key) as (
select f.table_name, f.constraint_name, p.table_name, f.r_constraint_name
from p join f on p.constraint_name = f.r_constraint_name
union all
select 'EMPLOYEES', (select constraint_name from p
where table_name = 'EMPLOYEES'), null, null from dual
)
select level as lvl, j.*
from j
start with parent_table is null
connect by nocycle parent_table = prior child_table
order by lvl, parent_table, child_table;
Таблицата "родител" в този случай е EMPLOYEES и името се появява два пъти на един и същи ред. Това може да се превърне в свързваща променлива, ако е необходимо. Използвах EMPLOYEES (забележка:трябва да е с главни букви, защото това е начинът, по който стойностите на низовете се съхраняват в системните таблици), защото изпълних това на стандартната HR схема; изход:
LVL CHILD_TABLE F_KEY PARENT_TABLE P_KEY
----- ----------------- -------------------- ----------------- -----------------
1 EMPLOYEES EMP_EMP_ID_PK
2 DEPARTMENTS DEPT_MGR_FK EMPLOYEES EMP_EMP_ID_PK
2 JOB_HISTORY JHIST_EMP_FK EMPLOYEES EMP_EMP_ID_PK
3 JOB_HISTORY JHIST_DEPT_FK DEPARTMENTS DEPT_ID_PK