sql >> データベース >  >> RDS >> Oracle

テーブルの依存関係の再帰クエリは、私が望むほど再帰的ではありません

    次のようなものが必要です:

    select t.table_name, level,lpad(' ', 2 * (level - 1))||t.table_name 
    from user_tables t
    join user_constraints c1 
        on (t.table_name = c1.table_name 
        and c1.constraint_type in ('U', 'P'))
    left join user_constraints c2 
        on (t.table_name = c2.table_name 
        and c2.constraint_type='R')
    start with t.table_name = 'ROOT_TAB'
    connect by prior c1.constraint_name = c2.r_constraint_name
    

    元のクエリの問題は、子テーブルのuc.constraint_nameが外部キーの名前であるということです。これは、最初の子をルートテーブルに接続する場合は問題ありませんが、2番目のレベルの子を最初のレベルに接続するために必要なものではありません。そのため、制約に対して2回結合する必要があります。1回はテーブルの主キーを取得するため、もう1回は外部キーを取得するためです。

    余談ですが、user_*ビューではなくall_*ビューをクエリする場合は、通常、table_nameだけでなく、table_nameとownerでそれらを結合する必要があります。複数のスキーマに同じ名前のテーブルがある場合、table_nameだけで結合すると、誤った結果が得られます。



    1. 日付はmysqlに0000-00-0000:00:00として挿入されています

    2. SQLで列値の連続発生カウントをフェッチする方法は?

    3. MySQLのインデックスを理解する:パート2

    4. SQLServerで重複行をチェックする4つの方法