sql >> Base de Datos >  >> RDS >> Oracle

La consulta recursiva para las dependencias de la tabla no es recurrente tanto como me gustaría

Quieres algo como esto:

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

El problema con la consulta original es que uc.constraint_name para la tabla secundaria es el nombre de la clave externa. Eso está bien para conectar el primer elemento secundario a la tabla raíz, pero no es lo que necesita para conectar los elementos secundarios del segundo nivel al primero. Es por eso que debe unirse contra las restricciones dos veces:una para obtener la clave principal de la tabla y otra para obtener las claves externas.

Aparte, si va a consultar las vistas all_* en lugar de las vistas user_*, generalmente desea unirlas en nombre_tabla Y propietario, no solo nombre_tabla. Si varios esquemas tienen tablas con el mismo nombre, unir solo table_name dará resultados incorrectos.