Rekursive Abfrage für die Tabelle " Abhängigkeiten nicht recursing nicht so viel, wie ich möchte
Hatte ich eine Idee, ich könnte eine Abfrage schreiben, um alle untergeordneten Tabellen einer root-Tabelle, basierend auf dem Fremdschlüssel.
Abfrage sieht wie folgt aus:
select level, lpad(' ', 2 * (level - 1)) || uc.table_name as "TABLE", uc.constraint_name, uc.r_constraint_name
from all_constraints uc
where uc.constraint_type in ('R', 'P')
start with uc.table_name = 'ROOT_TAB'
connect by nocycle prior uc.constraint_name = uc.r_constraint_name
order by level asc;
Den Ergebnissen, die ich bekomme so Aussehen:
1 ROOT_TAB XPKROOTTAB 1 ROOT_TAB R_20 XPKPART_TAB 2 CHILD_TAB_1 R_40 XPKROOTTAB 2 CHILD_TAB_2 R_115 XPKROOTTAB 2 CHILD_TAB_3 R_50 XPKROOTTAB
Diesem Ergebnis alle untergeordneten Tabellen der ROOT_TAB
, aber die Abfrage nicht Durchlaufen, um die Kinder CHILD_TAB_1
, CHILD_TAB_2
oder CHILD_TAB_3
.
Rekursive Abfragen sind neu für mich, so ich raten bin, bin ich etwas fehlt in der connect by
- Klausel, aber ich zeichne eine leere hier. Ist es tatsächlich möglich, um die vollständige Hierarchie von ROOT_TAB
in einer einzigen Abfrage, oder bin ich besser dran, das einwickeln der Abfrage in eine rekursive Prozedur?
- Warum haben Sie Rollen wieder mein edit?
- Ich mochte einige Teile davon, in anderen aber nicht. Ich habe nicht einen Weg finden, um selektiv ein Rollback nur ein Teil davon, so dass ich rollte nur wieder die ganze Sache. Warum hast du das edit in den ersten Platz? Was war so falsch mit ihm? 😉
- Ich erklärte, dass in der Zusammenfassung. Sie sollten nicht müssen Ihre Titel mit einem tag (siehe das MSE-FAQ posten für einige Diskussion darüber, warum), dein post hatte mehrere Rechtschreibfehler, und ich fühlte, ich könnte es machen, mehr lesbar. Der Weg, um eine selektive rollback ist einfach eine neue Bearbeiten Sie mit dem gewünschten Umkehrungen.
- Ja, werde ich wahrscheinlich einen neuen edit mit meiner bevorzugten Bearbeitungen später...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du willst so etwas wie dieses:
Das problem mit der ursprünglichen Abfrage ist, dass uc.constraint_name für die child-Tabelle ist der name des Fremdschlüssels. Das ist gut für den Anschluss des ersten Kindes auf die root-Tabelle, aber es ist nicht das, was Sie brauchen, um zu verbinden, die Kinder auf die zweite Ebene auf die erste. Das ist, warum Sie müssen sich gegen die Zwänge zweimal-einmal, um die Tabelle, den Primärschlüssel, sobald man die foreign-keys.
Als beiseite, wenn Sie gehen, um die Abfragen die all_* views anstatt der user_* - Ansichten, dass Sie in der Regel an, Sie zu begleiten auf table_name UND Eigentümer, nicht nur für table_name. Wenn mehrere schemas mit Tabellen mit dem gleichen Namen, Beitritt nur auf table_name geben falsche Ergebnisse.
Für den Fall mit mehreren schemas und mehrere root-Tabellen, versuchen Sie so etwas wie:
Nach Tiefe Tiefe Untersuchung, ich habe meine eigene version, dass die Prozesse alle Tabellen und retreives der Tabelle max level in der Hierarchie (er liest alle schemas, unter Berücksichtigung der Tabellen mit keine Eltern-Kind-Beziehung, die auf Ebene 1 zusammen mit root sind). Wenn Sie access, verwenden dba_ Tabellen anstelle von all_ lieben.
Bearbeiten:
Es ist "Art" ein Problem mit dieser Abfrage beim finden von Endlosschleifen.
Wenn wir diesen Baum:
weist lvl 2 zu c:
b --> c
und lvl 2 zu b:
c --> b
für d ist, erkennt es
b --> c --> d
so wird es weisen lvl 3
So wie Sie sehen können, das problem ist in der Schleife, die Werte von außen wird immer seine max richtige lvl