sql >> Databasteknik >  >> RDS >> Oracle

Rekursiv fråga för tabellberoenden är inte återkommande inte så mycket som jag skulle vilja

Du vill ha något sånt här:

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 ursprungliga frågan är att uc.constraint_name för den underordnade tabellen är namnet på den främmande nyckeln. Det är bra för att koppla det första barnet till rotbordet, men det är inte vad du behöver för att koppla barnen på den andra nivån till den första. Det är därför du måste gå med mot begränsningarna två gånger - en gång för att få tabellens primärnyckel, en gång för att få främmande nycklar.

För övrigt, om du ska fråga alla_*-vyerna snarare än user_*-vyerna, vill du i allmänhet gå med dem på tabellnamn OCH ägare, inte bara tabellnamn. Om flera scheman har tabeller med samma namn, kommer koppling på bara tabellnamn att ge felaktiga resultat.



  1. Mysql:Fråga för att ansluta tabelldata baserat på närmaste tidsstämpel

  2. Spara HABTM med extra fält?

  3. guide som primärnyckel?

  4. Behöver jag htmlentities() eller htmlspecialchars() i förberedda uttalanden?