[英]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';
使用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.