Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle - usuń wszystkie rekordy podrzędne dla rodzica

To jest prawie to, co klucze podstawowe i klucze obce i klauzule, takie jak ON DELETE CASCADE są dla. Jeśli nie jest za późno, możesz spróbować dodać ograniczenia PK i FK, zanim wykonasz jakiekolwiek usunięcia; wtedy wszystko będzie łatwe.

DODANO :Na podstawie dalszej dyskusji. Poniższego zapytania można użyć do znalezienia wszystkich tabel podrzędnych tabeli nadrzędnej. Zapytanie może być prawdopodobnie ulepszone na wiele sposobów, ale może to być dobry punkt wyjścia.

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;

W tym przypadku tabelą „rodzic” są PRACOWNICY, a nazwisko pojawia się dwukrotnie, w tym samym wierszu. W razie potrzeby można to przekształcić w zmienną wiązania. Użyłem EMPLOYEES (uwaga:musi być pisany wielkimi literami, ponieważ w ten sposób wartości ciągów są przechowywane w tabelach systemowych), ponieważ uruchomiłem to na standardowym schemacie HR; wyjście:

  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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Problem z połączeniem pand z lewej strony (ValueError:Próbujesz scalić kolumny obiektu i int64.)

  2. Jak korzystać z globalnej tabeli tymczasowej w procedurze Oracle?

  3. Czy istnieje lepszy operator Oracle do sprawdzania równości bezpieczny dla wartości null?

  4. Jak w SQL*Plus zmienić monit tak, aby wyświetlał połączonego użytkownika i bazę danych?

  5. ORA-00942:tabela lub widok nie istnieje — Oracle