2017-01-12 12 views
-1

テーブル上のすべての外部キー参照を選択する必要があります。私は動作するクエリを思いついたが、実行に9秒かかる。誰かが最適化を手伝うことができれば、とてもいいですね。どうもありがとうございました!ここでテーブル上のすべての外部キー参照の選択

はクエリです:

SELECT A.TABLE_NAME REFENCING_TABLE, 
     A.COLUMN_NAME REFENCING_COLUMN, 
     B.TABLE_NAME REFERENCED_TABLE, 
     B.COLUMN_NAME REFERENCED_COLUMN 
    from (select TABLE_NAME, 
       COLUMN_NAME, 
       REFERENCED_CONSTRAINT_NAME, 
       POSITION 
      from all_cons_columns C 
      join (select CONSTRAINT_NAME, 
         PK.REFERENCED_CONSTRAINT_NAME 
        from all_constraints FK 
        JOIN (select CONSTRAINT_NAME REFERENCED_CONSTRAINT_NAME 
          from all_constraints 
          where constraint_type in ('P','U') and 
           table_name = :tablename) PK 
        on FK.R_CONSTRAINT_NAME = PK.REFERENCED_CONSTRAINT_NAME 
        where constraint_type = 'R') FK 
      on C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME) A 
    join (select TABLE_NAME, 
       COLUMN_NAME, 
       CONSTRAINT_NAME, 
       POSITION 
      from all_cons_columns) B 
    on REFERENCED_CONSTRAINT_NAME = B.CONSTRAINT_NAME AND 
     A.POSITION = B.POSITION; 
+0

を、あなたは、スキーマ全体でこれを実行する必要がありますか?単一のスキーマでのみこれを行う必要がある場合は、 'all_something'ビューを' user_something'ビューに変更してください。次に、入力としてテーブル名を取得します。スキーマ間でこれを行う必要がある場合は、スキーマ名も入力する必要があります。別のスキーマに同じ名前の表があると、混乱や誤った結果につながる可能性があります。 – mathguy

答えて

0

あなたは、テーブル上のすべての外部キー参照を見つけるために、このクエリを使用することがあります。

SELECT 
fk.owner fk_schema_owner,fk.table_name fk_table, 
fk.column_name fk_column, fk.constraint_name fk_constraint_name, 
pk.r_owner pk_schema_owner, 
c_pk.table_name pk_table_name, c_pk.constraint_name pk_constraint_name 
FROM 
all_cons_columns fk 
    JOIN all_constraints pk 
    ON fk.owner = pk.owner AND fk.constraint_name = pk.constraint_name 
    JOIN all_constraints c_pk 
    ON pk.r_owner = c_pk.owner AND pk.r_constraint_name = c_pk.constraint_name 
    WHERE pk.constraint_type = 'R' AND fk.table_name = :InputTableName 
関連する問題