2016-04-29 13 views
0

キーに基づいて複数の表およびスキーマから特定の入力用のデータをインポートする必要があります。スキーマ内の表階層を検索するOracle SQL

For-Ex:複数の表に共通のACCOUNT_ID COLUMNがあります(表はFKと相互依存しています)。私は複数のスキーマからすべてのテーブルから特定のアカウントのデータをインポートし、SQLスクリプトを生成したいと思います。

しかし、私がスクリプトを実行すると、完全性違反エラーでエラーにならないように、親テーブルの最初の子テーブルと子テーブルの順序をFKと結びつける必要があります。

1つの方法は、すべての制約を無効にし、スクリプトを生成し、実行してから制約を有効にすることです。

しかし、私はこれを行うより良い方法があるかどうかを見つけようとしています。そして、制約を有効/無効にすることは私にとっては良い解決策ではないかもしれません。

この問題についてのご意見をお待ちしております。

+0

この記事をチェックしてください:https://community.oracle.com/thread/1051352?start=0&tstart=0 –

答えて

0

テーブルでは外部キーに基づいた階層が作成されているとします。たとえば、T1はT2を参照し、T2はT3を参照します。
この場合、階層クエリが必要です。助けを借りて、今

TABLE_NAME REFERENCED_TABLE_NAME 
---------- ------------------------- 
TTT22  TTT1      
TTT211  TTT21      
TTT21  TTT1      
TTT2111 TTT211     
TTT2112 TTT211 

とを:

CREATE TABLE ttt1(
    ACCOUNT_ID int primary key, 
    somecolumn varchar2(100) 
); 

CREATE TABLE ttt21(
    id int primary key, 
    ACCOUNT_ID int referencing ttt1(ACCOUNT_ID), 
    somecolumn varchar2(100) 
); 

CREATE TABLE ttt22(
    id int primary key, 
    ACCOUNT_ID int referencing ttt1(ACCOUNT_ID), 
    somecolumn varchar2(100) 
); 

CREATE TABLE ttt211(
    id int primary key, 
    ACCOUNT_ID int referencing ttt21(id), 
    somecolumn varchar2(100) 
); 

CREATE TABLE ttt2111(
    id int primary key, 
    ACCOUNT_ID int referencing ttt211(id), 
    somecolumn varchar2(100) 
); 

CREATE TABLE ttt2112(
    id int primary key, 
    ACCOUNT_ID int referencing ttt211(id), 
    somecolumn varchar2(100) 
); 

ビューが得られます。この場合、例えば

select c.table_name, uc.table_name as referenced_table_name 
from user_constraints c 
join USER_CONS_columns uc ON c.r_constraint_name = uc.constraint_name 
where c.constraint_type = 'R' 

:まず、テーブル間の参照を表示するビューを作成

このビューの階層クエリを作成することができます。

まずあなたがレベル2でというようにして、レベル1ですべてのテーブルを処理する必要がある -

 LEVEL REFERENCED_TABLE_NAME 
---------- -------------------------      
     1 TTT1      
     2 TTT21      
     3 TTT211     
     3 TTT211     
     1 TTT1 

LEVEL列がテーブルをインポートしなければならない順序を提供します:以下の出力が得られます

WITH my_view AS( 
    select c.table_name, uc.table_name as referenced_table_name 
    from user_constraints c 
    join USER_CONS_columns uc ON c.r_constraint_name = uc.constraint_name 
    where c.constraint_type = 'R' 
) SELECT level, m.referenced_table_name 
FROM my_view m 
START WITH referenced_table_name not in (select table_name from my_view) 
CONNECT BY prior table_name = referenced_table_name; 

そうです。

関連する問題