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

Tworzenie wykresu zależności tabeli za pomocą zapytania rekurencyjnego

    select parent, child, level from (
select parent_table.table_name parent, child_table.table_name child
 from user_tables      parent_table,
      user_constraints parent_constraint,
      user_constraints child_constraint,
      user_tables      child_table
where parent_table.table_name = parent_constraint.table_name
  and parent_constraint.constraint_type IN( 'P', 'U' )
  and child_constraint.r_constraint_name = parent_constraint.constraint_name
  and child_constraint.constraint_type   = 'R'
  and child_table.table_name = child_constraint.table_name
  and child_table.table_name != parent_table.table_name
)
start with parent = 'DEPT'
connect by prior child = parent

powinno działać (oczywiście zastąp nazwę tabeli) zakładając, że wszystko jest w tym samym schemacie. Użyj wersji DBA_ tabel słowników danych i warunków dla kolumn OWNER i R_OWNER, jeśli musisz obsłużyć zależności między schematami. Po dalszych rozważaniach nie uwzględnia to również ograniczeń autoreferencyjnych (tj. ograniczenia w tabeli EMP, że kolumna MGR odwołuje się do kolumny EMPNO), więc musisz zmodyfikować kod, aby obsłużyć ten przypadek, jeśli musisz sobie poradzić z ograniczeniami autoreferencyjnymi.

Do celów testowych dodałem kilka nowych tabel do schematu SCOTT, które również odwołują się do tabeli DEPT (w tym zależności wnuka)

SQL> create table dept_child2 (
  2  deptno number references dept( deptno )
  3  );

Table created.

SQL> create table dept_child3 (
  2    dept_child3_no number primary key,
  3    deptno number references dept( deptno )
  4  );

Table created.

SQL> create table dept_grandchild (
  2    dept_child3_no number references dept_child3( dept_child3_no )
  3  );

Table created.

i zweryfikowano, że zapytanie zwróciło oczekiwany wynik

SQL> ed
Wrote file afiedt.buf

  1  select parent, child, level from (
  2  select parent_table.table_name parent, child_table.table_name child
  3   from user_tables      parent_table,
  4        user_constraints parent_constraint,
  5        user_constraints child_constraint,
  6        user_tables      child_table
  7  where parent_table.table_name = parent_constraint.table_name
  8    and parent_constraint.constraint_type IN( 'P', 'U' )
  9    and child_constraint.r_constraint_name = parent_constraint.constraint_name
 10    and child_constraint.constraint_type   = 'R'
 11    and child_table.table_name = child_constraint.table_name
 12    and child_table.table_name != parent_table.table_name
 13  )
 14  start with parent = 'DEPT'
 15* connect by prior child = parent
SQL> /

PARENT                         CHILD                               LEVEL
------------------------------ ------------------------------ ----------
DEPT                           DEPT_CHILD3                             1
DEPT_CHILD3                    DEPT_GRANDCHILD                         2
DEPT                           DEPT_CHILD2                             1
DEPT                           EMP                                     1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pobierz nazwę tabeli z kolumny dla klauzuli from

  2. ORA-00604 ORA-12705

  3. różnica między klauzulą ​​ON a klauzulą ​​using w sql

  4. Jak zainstalować bazę danych Oracle w systemie Windows

  5. Wyświetlanie komunikatów okna modalnego w formularzach Oracle za pomocą Show_Alert