Anzeige aller Fremdschlüssel Beziehungen

gamma_matrices

Cadet 4th Year
Registriert
Sep. 2018
Beiträge
121
Hallo,

hier ist die alternative QUery zur Anzeige der gesamten Parent Tabellen mit den dazugehörigen Childs einer Datenbank aus Bankwesen!
rel. DBMS: Oracle SQL Dev. 18c

SQL:
SELECT a.constraint_name, a.table_name, a.column_name,  c.owner,
       c_pk.table_name r_table_name,  b.column_name r_column_name
  FROM user_cons_columns a
  JOIN user_constraints c ON a.owner = c.owner
       AND a.constraint_name = c.constraint_name
  JOIN user_constraints c_pk ON c.r_owner = c_pk.owner
       AND c.r_constraint_name = c_pk.constraint_name
  JOIN user_cons_columns b ON C_PK.owner = b.owner
       AND  C_PK.CONSTRAINT_NAME = b.constraint_name AND b.POSITION = a.POSITION     
 WHERE c.constraint_type = 'R';

Nun wenn ich die Query ausführe, bekomme ich ein LEERES Ergebnis Fenster!

Jemand eine Idee?
 
Meine Idee wäre sich die Tabellen einzeln mal genau anzusehen, mit einem Join starten und erst dann erweitern um den Nächsten. Ich würde bei der Fehlersuche auch SELECT * und FULL JOIN verwenden.

P.S.
Und die WHERE Bedingung raus.
 
  • Gefällt mir
Reaktionen: gamma_matrices, Makkaroni, Carsti80 und eine weitere Person
Sehe grad den Mehrwert von c_pk gegenüber c nicht. Fehler beim übernehmen der Abfrage vielleicht?
 
fang doch erstmal mit einer kleinen Select anfrage an die Funktioniert, um dich dann Join für Join dranzutasten wenn es nicht anders funktioniert. Sonst wirst du es nie lernen --> Ist halt eine Hausaufgabe.
 
Stimmt, der zweite Join ist absolut unnötig.
Wenn r_owner = owner und r_constraint_name = constraint_name
sein soll, gehört das ins WHERE oder als Bedingung in den ersten JOIN.
 
Das leere Ergebnisfenster kann ja korrekt sein! Dann wäre auch deine Abfrage korrekt!
Ich kenne die verlinkten Tabellen nicht. Sieh die die Inhalte dieser Tabellen an, damit du beurteilen kannst, was der zu erwartende Output ist.

Mach ein
Select top 1000 * FROM user_cons_columns
Select top 1000 * from user_constraints
Select top 1000 * from user_cons_columns

Sieh die die Daten an! Kann eine Verlinkung überhaupt zu einem Ergebnis führen?

Vielleicht solltest du mal grundsätzlich deine Problemstellung/Ziel erklären?
 
  • Gefällt mir
Reaktionen: gamma_matrices
Deswegen macht man an der Stelle auch ein FULL OUTER join, jede Menge Driss da drin aber man sieht sofort was los ist.

Ansonsten sicher, es mag so stimmen daß für eine konkrete Situation das resultset leer ist -- offensichtlich, wenn es nirgendwo einen FK definiert gibt.

Zwei Dinge suggerieren aber imo daß die Abfrage suboptimal ist:
1.
Der Join hat einen Zirkelbezug von a nach b nach c und zurück zu a. Joins sind, per ihrer Natur, Vektorprodukte: eine Kombination aus Unabhängigen Dimensionen, hier also von drei Ebenen im Raum die sich jeweils in einer Gerade scheiden (der Join-Bedingung zwischen jeweils zwei Relationen). Drei Tabellen => zwei Joins. Jeder Join mehr ist einer zuviel.

2. Es geht per Auftrag um eine Hierarchie. Wir suchen eine Baumstruktur (in beliebig gearteter Form) die meinem Child node (der FK-Spalte) einen Parent node (die PK Spalte) zuordnet.

=> Common Table Expression.
 
Das ist keine Hausaufgabe, sondern ich möchte für mich selbst mir eine Übersicht über alle Referenztabellen (parent and child) anzeigen, um eine spezifische Regel abzuleiten.
Ich habe aber feststellen müssen, dass die Tabellen in dem von mir operierenden Schema leider keine Ergebnismenge != {} ermöglichen, da die Referenzen in der Form wie ich erwartet hätte, aufgrund des Designs gar nicht mgl. sind!:mad:
Vielen Dank euch allen für die ganzen Inputs, Vorschläge etc.!
 
Zurück
Oben