2016-04-29 8 views
0

Ich habe einige Daten für eine bestimmte Eingabe aus mehreren Tabellen und Schemata basierend auf einem Schlüssel importieren müssen.Oracle SQL, Tabellenhierarchien in einem Schema zu finden

For-Ex: Ich habe ACCOUNT_ID COLUMN, die mehreren Tabellen gemeinsam ist (Tabellen sind voneinander abhängig mit FK). Ich möchte Daten für ein bestimmtes Konto aus allen Tabellen aus mehreren Schemas importieren und ein SQL-Skript generieren.

Aber die Herausforderung ist, muss ich zuerst Elterntabelle und dann ihre Kind-Tabelle (gebunden mit FK) in der Reihenfolge, so dass wenn ich das Skript ausführen, sollte es nicht mit Integrität Verletzung Fehler aus.

Eine Möglichkeit besteht darin, alle Abhängigkeiten zu deaktivieren, das Skript zu generieren, auszuführen und anschließend die Einschränkungen zu aktivieren.

Aber ich versuche zu finden, ob es einen besseren Weg gibt, dies zu tun. Und das Aktivieren/Deaktivieren der Einschränkungen ist möglicherweise keine gute Lösung für mich.

Schätzen Sie alle Eingaben zu diesem Problem.

+0

Schauen Sie sich diesen Beitrag an: https://community.oracle.com/thread/1051352?start=0&tstart=0 –

Antwort

0

Sie sagen, dass Ihre Tabellen eine Hierarchie basierend auf Fremdschlüsseln erstellen, so dass zum Beispiel T1 T2 und T2 T3 usw. referenziert.
In diesem Fall benötigen Sie eine hierarchische Abfrage.

Zuerst eine Ansicht erstellen, die Verweise zwischen den Tabellen zeigt:

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' 

Zum Beispiel in diesem Fall:

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) 
); 

die Ansicht gibt:

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

Und nun, mit Hilfe In dieser Ansicht können Sie eine hierarchische Abfrage erstellen:

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; 

die folgende Ausgabe gibt:

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

Eine LEVEL Spalte gibt, in denen eine Bestellung Tabellen importiert werden müssen - zuerst müssen Sie alle Tabellen auf der Ebene 1, dann auf Stufe 2 und so weiter verarbeiten und bald.