【问题标题】:Access path between parent and child table in OracleOracle中父子表之间的访问路径
【发布时间】:2017-08-28 19:50:25
【问题描述】:

我有如下所示的父表和子表。

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 查询吗

【问题讨论】:

  • REFERENCE_COLUMNSREFERENCED_COLUMNS 列在问题陈述中的作用是什么?
  • 您需要CONNECT BY 子句才能完成这项工作。
  • @DavidAldridge 或递归 Cte.

标签: sql oracle


【解决方案1】:

正如@DavidAldrige 所述,您需要使用Oracle 的CONNECT BY 来处理分层查询。

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

sqlfiddle demo

【讨论】:

    【解决方案2】:

    使用 Oracle 的 connect by 子句绝对没有错。我一直在尝试使用公用表表达式 (CTE),因为它们不是 Oracle 专有的。该技能可以转换为其他数据库,在我的例子中是 SQL 服务器。以下查询将为您提供所需的结果,但使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      相关资源
      最近更新 更多