2017-08-28 58 views
0

我有如下所示的父表和子表。在Oracle中的父表和子表之間的訪問路徑

Child_table | Reference_colums | Parent_table | Referenced_columns 
------------|------------------|--------------|------------------- 
T1   | Clan_Id   | T0   | Clan_Id 
X1   | Clan_Id   | T0   | Clan_Id 
X2   | Clan_Id   | T0   | Clan_Id 
T2   | Clan_Id   | T1   | Clan_Id 
Y1   | Clan_Id   | T1   | Clan_Id 
Y2   | Clan_Id   | X1   | Clan_Id 
T3   | C31    | T2   | C2 
T4   | C4    | T3   | C32 

如果我給輸入端(父表= T0一個子表爲T4) 我應該得到輸出作爲

Child_table | Reference_colums | Parent_table | Referenced_columns 
------------|------------------|--------------|------------------- 
T1   | Clan_Id   | T0   | Clan_Id 
T2   | Clan_Id   | T1   | Clan_Id 
T3   | C31    | T2   | C2 
T4   | C4    | T3   | C32 

作爲T4和T0之間的訪問路徑是 T0 - > T1-> T2-> T3-> T4

能否請你幫我寫SELECT查詢在Oracle中

+0

「REFERENCE_COLUMNS」和「REFERENCED_COLUMNS」列在問題陳述中扮演什麼角色(如果有的話)? – mathguy

+1

你需要'CONNECT BY'子句來完成這個工作。 –

+0

@DavidAldridge或遞歸Cte。 – xQbert

回答

0

正如@DavidAldrige提到你需要使用Oracle的處理分層查詢的。

SELECT * 
FROM tab 
START WITH child = 'T4' 
CONNECT BY prior parent = child and child != 'T0'; 

sqlfiddle demo

0

絕對沒有錯誤使用Oracle的通過條款進行連接。我一直試圖使用公用表表達式(CTE),因爲它們不是Oracle專有的。技能轉換爲其他數據庫,在我的情況下是SQL服務器。以下查詢會給你你想要的結果,但使用CTE而不是連接

DATASET子句只是設置的採樣數據,FINDSET是其中執行的工作:

WITH 
    dataset 
    AS 
     (SELECT 'T1' AS child_table, 'T0' AS parent_table 
      FROM DUAL 
     UNION ALL 
     SELECT 'X1' AS child_table, 'T0' AS parent_table 
      FROM DUAL 
     UNION ALL 
     SELECT 'X2' AS child_table, 'T0' AS parent_table 
      FROM DUAL 
     UNION ALL 
     SELECT 'T2' AS child_table, 'T1' AS parent_table 
      FROM DUAL 
     UNION ALL 
     SELECT 'Y1' AS child_table, 'T1' AS parent_table 
      FROM DUAL 
     UNION ALL 
     SELECT 'Y2' AS child_table, 'X1' AS parent_table 
      FROM DUAL 
     UNION ALL 
     SELECT 'T3' AS child_table, 'T2' AS parent_table 
      FROM DUAL 
     UNION ALL 
     SELECT 'T4' AS child_table, 'T3' AS parent_table 
      FROM DUAL), 
    findset (parent_table, child_table) 
    AS 
     (SELECT parent_table, child_table 
      FROM dataset 
      WHERE child_table = 'T4' 
     UNION ALL 
     SELECT dataset.parent_table, dataset.child_table 
      FROM findset INNER JOIN dataset ON dataset.child_table = 
findset.parent_table) 
    SELECT * 
     FROM findset; 

這給出以下結果:

PARENT_TABLE CHILD_TABLE T3 T4
T2 T3
T1 T2
T0 T1