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列の条件を使用します。さらに考えてみると、これは自己参照制約(つまり、MGR列がEMPNO列を参照するEMPテーブルの制約)も考慮していないため、対処する必要がある場合は、そのケースを処理するようにコードを変更する必要があります。自己参照制約付き。

    テストの目的で、DEPTテーブル(孫の依存関係を含む)も参照するいくつかの新しいテーブルをSCOTTスキーマに追加しました

    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. SQL Server(T-SQL)でデータベースメールプロファイルを作成する

    2. Oracleで列のデータ型を確認する3つの方法

    3. SQL Serverのラッチ–知っておくべきその他のラッチ

    4. MySQLにJSONデータを保存する方法