Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Die rekursive Abfrage für Tabellenabhängigkeiten ist nicht so rekursiv, wie ich möchte

Sie wollen so etwas:

select t.table_name, level,lpad(' ', 2 * (level - 1))||t.table_name 
from user_tables t
join user_constraints c1 
    on (t.table_name = c1.table_name 
    and c1.constraint_type in ('U', 'P'))
left join user_constraints c2 
    on (t.table_name = c2.table_name 
    and c2.constraint_type='R')
start with t.table_name = 'ROOT_TAB'
connect by prior c1.constraint_name = c2.r_constraint_name

Das Problem mit der ursprünglichen Abfrage besteht darin, dass uc.constraint_name für die untergeordnete Tabelle der Name des Fremdschlüssels ist. Das ist in Ordnung, um das erste Kind mit der Stammtabelle zu verbinden, aber es ist nicht das, was Sie brauchen, um die Kinder auf der zweiten Ebene mit der ersten zu verbinden. Aus diesem Grund müssen Sie zweimal gegen die Einschränkungen antreten – einmal, um den Primärschlüssel der Tabelle zu erhalten, einmal, um die Fremdschlüssel zu erhalten.

Abgesehen davon, wenn Sie die all_*-Ansichten und nicht die user_*-Ansichten abfragen, möchten Sie sie im Allgemeinen auf table_name UND Eigentümer verbinden, nicht nur auf table_name. Wenn mehrere Schemas Tabellen mit demselben Namen haben, führt die Verknüpfung nur mit Tabellenname zu falschen Ergebnissen.