Oracle
 sql >> база данни >  >> RDS >> Oracle

Изграждане на графика на зависимостта на таблицата с рекурсивна заявка

    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

трябва да работи (заменете името на таблицата, разбира се), като се приеме, че всичко е в една и съща схема. Използвайте DBA_ версиите на таблиците на речника на данните и условията за колоните OWNER и R_OWNER, ако трябва да се справите със зависимости между различни схеми. При по-нататъшно размисъл, това не отчита ограниченията за самореферентни (т.е. ограничение на таблицата EMP, че колоната MGR препраща към колоната EMPNO), така че ще трябва да модифицирате кода, за да се справите с този случай, ако трябва да се справите със самореферентни ограничения.

За целите на тестването добавих няколко нови таблици към схемата SCOTT, които също препращат към таблицата DEPT (включително зависимост от внуците)

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.

и провери дали заявката е върнала очаквания изход

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. Как да шифровате парола в Oracle?

  2. Пример за функция на Oracle за получаване на брой дни между две дати

  3. как да експортирате данни от таблицата с регистрационни файлове в тялото на имейла в oracle

  4. ORA-01008:не всички променливи са обвързани. Те са обвързани

  5. Правилният начин за предоставяне на достъп на потребителите до допълнителни схеми в Oracle