2017-09-13 149 views
0

當給出table_name(T9)和column_name(C1)時,我需要找出其中有column_name(C1)的最近父表。oracle中父表和子表之間的訪問路徑

例如: 爲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通過C8連接到T8等)

現在開始我需要寫一個查詢,應該返回

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

我想使用all_constraints和all_cons_cols和conn通過路徑找到等級關係。如果他們已經創建了這樣的查詢,有人可以幫助我嗎?

+0

閱讀關於CONNECT BY – OldProgrammer

+0

你知道,參考約束可能在一組列上,而不僅僅是一列,對嗎?你是否在考慮當你考慮你的問題? – mathguy

回答

0

如果你有一個簡單的模式結構,這可能會爲你工作:從this similar question修改

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; 

相關問題