Oracle
 sql >> база данни >  >> RDS >> Oracle

Рекурсивната заявка за зависимости от таблици не е рекурсивна толкова, колкото бих искал

Искате нещо подобно:

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

Проблемът с оригиналната заявка е, че uc.constraint_name за дъщерната таблица е името на външния ключ. Това е добре за свързване на първото дете към основната таблица, но не е това, от което се нуждаете, за да свържете децата на второто ниво към първото. Ето защо трябва да се присъедините срещу ограниченията два пъти -- веднъж, за да получите първичния ключ на таблицата, веднъж, за да получите външните ключове.

Като настрана, ако ще правите запитвания към all_* изгледите, а не към user_* изгледите, обикновено искате да ги присъедините към table_name И собственик, а не само table_name. Ако няколко схеми имат таблици с едно и също име, присъединяването само към table_name ще даде неправилни резултати.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вмъкнете в с union all и nextval не работи с дублиращи се стойности

  2. Вземете последния идентификатор на вмъкнатия ред в Oracle DB

  3. Как да изпълним ляво присъединяване в Hibernate Query Language?

  4. Преобразувайте TimeStamp във формат на низ TZ в TimeStamp в Oracle

  5. Oracle Type Casting