簡體   English   中英

Oracle中父表和子表之間的訪問路徑

[英]Access path between parent and child table in 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

您能幫我在Oracle中編寫SELECT查詢嗎

如@DavidAldrige所述,您需要使用Oracle的CONNECT BY處理分層查詢。

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

sqlfiddle演示

使用Oracle的connect by子句絕對沒有錯。 我一直在嘗試使用通用表表達式(CTE),因為它們不是Oracle專有的。 該技能可以轉換為其他數據庫,在我的情況下為SQL Server。 以下查詢將為您提供所需的結果,但是使用CTE而不是connect by

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM