У меня возникла идея написать запрос для поиска всех дочерних таблиц корневой таблицы на основе внешних ключей.
Запрос выглядит так:
select level, lpad(' ', 2 * (level - 1)) || uc.table_name as "TABLE", uc.constraint_name, uc.r_constraint_name
from all_constraints uc
where uc.constraint_type in ('R', 'P')
start with uc.table_name = 'ROOT_TAB'
connect by nocycle prior uc.constraint_name = uc.r_constraint_name
order by level asc;
Результаты, которые я получаю, выглядят следующим образом:
1 ROOT_TAB XPKROOTTAB 1 ROOT_TAB R_20 XPKPART_TAB 2 CHILD_TAB_1 R_40 XPKROOTTAB 2 CHILD_TAB_2 R_115 XPKROOTTAB 2 CHILD_TAB_3 R_50 XPKROOTTAB
Этот результат — все дочерние таблицы ROOT_TAB
, но запрос не обращается к дочерним таблицам CHILD_TAB_1
, CHILD_TAB_2
или CHILD_TAB_3
.
Рекурсивные запросы для меня новы, поэтому я предполагаю, что что-то упустил в предложении connect by
, но здесь я ничего не понимаю. Действительно ли возможно получить полную иерархию ROOT_TAB
в одном запросе, или мне лучше обернуть запрос в рекурсивную процедуру?