Oracle
 sql >> Database >  >> RDS >> Oracle

La query ricorsiva per le dipendenze delle tabelle non è ricorrente non quanto vorrei

Vuoi qualcosa del genere:

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

Il problema con la query originale è che uc.constraint_name per la tabella figlio è il nome della chiave esterna. Va bene per connettere il primo figlio alla tabella radice, ma non è ciò di cui hai bisogno per connettere i bambini del secondo livello al primo. Ecco perché devi unirti contro i vincoli due volte:una per ottenere la chiave primaria della tabella, una per ottenere le chiavi esterne.

Per inciso, se hai intenzione di interrogare le viste all_* piuttosto che le viste utente_*, generalmente vuoi unirti a nome_tabella E proprietario, non solo nome_tabella. Se più schemi hanno tabelle con lo stesso nome, l'unione su solo nome_tabella darà risultati errati.