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

Rekursiv forespørgsel til tabelafhængigheder er ikke tilbagevendende, ikke så meget, som jeg gerne vil

Du vil have noget som dette:

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

Problemet med den oprindelige forespørgsel er, at uc.constraint_name for den underordnede tabel er navnet på den fremmede nøgle. Det er fint til at forbinde det første barn til rodbordet, men det er ikke det, du skal bruge for at forbinde børnene på andet niveau med det første. Det er grunden til, at du skal tilslutte dig mod begrænsningerne to gange - én gang for at få bordets primære nøgle, én gang for at få fremmednøglerne.

Som en sidebemærkning, hvis du vil forespørge på alle_*-visningerne i stedet for bruger_*-visningerne, vil du generelt slutte dig til dem på tabelnavn OG ejer, ikke kun tabelnavn. Hvis flere skemaer har tabeller med samme navn, vil sammenføjning på kun tabelnavn give forkerte resultater.



  1. Slet script SQL Server 2008

  2. if condition i mysql select statement

  3. plpgsql - ved hjælp af dynamisk tabelnavn i declare-sætning

  4. App til at overvåge PostgreSQL-forespørgsler i realtid?