sql >> Base de Datos >  >> RDS >> Oracle

Oracle:elimine todos los registros secundarios para un padre

Esto es más o menos lo que son las claves primarias y las claves externas y cláusulas como ON DELETE CASCADE son para. Si no es demasiado tarde, puede intentar agregar restricciones de PK y FK antes de realizar cualquier eliminación; entonces todo será fácil.

AÑADIDO :Basado en discusiones posteriores. La consulta a continuación se puede usar para encontrar todas las tablas descendientes de una tabla principal. La consulta probablemente se puede mejorar de muchas maneras, pero puede ser un buen punto de partida.

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;

La tabla "principal" en este caso es EMPLEADOS y el nombre aparece dos veces, en la misma línea. Eso se puede convertir en una variable de vinculación si es necesario. Usé EMPLEADOS (nota:debe estar en mayúsculas porque así es como se almacenan los valores de cadena en las tablas del sistema) porque ejecuté esto en el esquema estándar de recursos humanos; salida:

  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