Путь доступа между родительской и дочерней таблицами в Oracle

Когда даны table_name (T9) и column_name (C1), мне нужно найти ближайшую родительскую таблицу, в которой есть column_name (C1).

Например: путь родительской таблицы для T9

T9(C9,C8) -> T8(C8,C7) -> T7(C7,C1) -> T6(C1,C2) -> T5(C1,C3)
T9(C9,C11) -> X8(C11,C7) -> X7(C7,C1) -> T6(C1,C2) -> T5(C1,C3)
T9(C9,C12) -> Y8(C12,C7) -> Y7(C7,C3) -> Y6(C3,C1) -> T5(C1,C3)
T9(C9,C13) -> Z8(C13,C7) -> Z7(C7,C2) -> Z6(C2,C3) -> T5(C3,C1)

Выше - родительские дочерние отношения, начиная с дочерней таблицы T9 (чтение T9 связано с T8 через C8 и т. Д.)

Теперь мне нужно написать запрос, который должен вернуть

T9->T8->T7  
T9->X8->X7
T9->Y8->Y7->Y6
T9->Z8->Z7->Z6->T5

Я пытаюсь использовать all_constraints и all_cons_cols и подключиться по пути, чтобы найти иерархические отношения. Может ли кто-нибудь помочь мне, если они уже создали такой запрос.

1 ответ

Если у вас есть простая структура схемы, это может работать для вас:

select access_path
from (
    SELECT substr(sys_connect_by_path(a.table_name, '->'),3) as access_path, column_name
    from all_cons_columns a
    left join all_constraints b
        on a.constraint_name = b.constraint_name
    start with a.table_name = :T9
    connect by nocycle prior b.constraint_name = b.r_constraint_name 
    order by level)
where column_name = :C1;

Модифицировано из этого аналогичного вопроса.

Другие вопросы по тегам