sql >> Databáze >  >> RDS >> Oracle

Vytvoření grafu závislosti tabulky pomocí rekurzivního dotazu

    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

by mělo fungovat (samozřejmě nahraďte název tabulky) za předpokladu, že je vše ve stejném schématu. Pokud potřebujete zvládnout závislosti mezi schématy, použijte verze DBA_ tabulek a podmínek datového slovníku pro sloupce OWNER a R_OWNER. Při bližším zamyšlení to nezohledňuje ani samo-referenční omezení (tj. omezení v tabulce EMP, že sloupec MGR odkazuje na sloupec EMPNO), takže byste museli upravit kód, aby tento případ zvládl, pokud potřebujete řešit se sebereferenčními omezeními.

Pro účely testování jsem do schématu SCOTT přidal několik nových tabulek, které také odkazují na tabulku DEPT (včetně závislosti vnuka)

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.

a ověřili, že dotaz vrátil očekávaný výstup

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. Získejte čas provedení dotazu PostgreSQL

  2. Kdy mám na SQL Serveru používat středníky?

  3. Optimalizujte skupinový maximální dotaz

  4. Maximalizace účinnosti databázového dotazu pro MySQL – část první