sql >> Databáze >  >> RDS >> Oracle

Rekurzivní dotaz na závislosti tabulek se neopakuje tolik, jak bych chtěl

Chcete něco takového:

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

Problém s původním dotazem je, že uc.constraint_name pro podřízenou tabulku je název cizího klíče. To je v pořádku pro připojení prvního potomka ke kořenové tabulce, ale není to to, co potřebujete k připojení dětí na druhé úrovni k první. Proto se musíte proti omezením připojit dvakrát – jednou pro získání primárního klíče tabulky, jednou pro získání cizích klíčů.

Kromě toho, pokud se budete dotazovat na pohledy all_* spíše než na pohledy user_*, obecně je chcete připojit na jméno_tabulky A vlastník, nikoli pouze název_tabulky. Pokud má více schémat tabulky se stejným názvem, spojení pouze na název_tabulky poskytne nesprávné výsledky.



  1. Výkonnostní překvapení a předpoklady:DATEADD

  2. MySQL. Produkty neprodané v určitém období

  3. PHP/MYSQL Retrieve Name na základě jiného kritéria

  4. jakou databázi použít pro samostatnou aplikaci Winforms