【问题标题】:Teradata Recursive SQL to find Parents of Parent of given Child tableTeradata 递归 SQL 查找给定子表的父级
【发布时间】:2019-07-29 17:33:20
【问题描述】:

我已经安装了 Teradata Express 并在其中加载了名为“Finance”的 teradata 公开可用的数据库。

它有一些使用 PK-FK 的父子关系。

我的要求是找出所有父母,授予给定孩子的父母。

我已经使用了DBC.All_RI_Parents 元数据表并编写了一个递归 SQL 来找出相同的结果,但它没有给出父母的父母和给定孩子的伟大父母。

WITH RECURSIVE CTE
(indexid,
indexname,
parentdb,
parenttable,
parentkeycolumn,
childdb,
childtable,childkeycolumn,
DEPTH) AS
(
select indexid,indexname,parentdb,parenttable,parentkeycolumn,
childdb,childtable,childkeycolumn,1 AS DEPTH 
from DBC.All_RI_Parents where childdb='finance' and childtable='fin_loan'
UNION ALL
SELECT par.indexid,par.indexname,par.parentdb,par.parenttable,par.parentkeycolumn,
par.childdb,par.childtable,par.childkeycolumn ,
CTE.DEPTH + 1
FROM CTE INNER JOIN DBC.All_RI_Parents par
ON CTE.parentkeycolumn = par.childkeycolumn
and CTE.parenttable = par.childtable
and CTE.parentdb = par.childdb
)
SELECT * FROM CTE 

我已经从

下载了数据集

https://community.teradata.com/t5/Blog/Demo-databases-for-download/ba-p/85684

如果我在这里做错了,请告诉我。

【问题讨论】:

    标签: sql teradata teradata-sql-assistant


    【解决方案1】:

    我通过深入研究不应该添加CTE.parentkeycolumn = par.childkeycolumn 的数据发现了这一点,因为列名可能不同。删除后,它工作正常,

    WITH RECURSIVE CTE
    (indexid,
    indexname,
    parentdb,
    parenttable,
    parentkeycolumn,
    childdb,
    childtable,childkeycolumn,
    DEPTH) AS
    (
    select indexid,indexname,parentdb,parenttable,parentkeycolumn,
    childdb,childtable,childkeycolumn,1 AS DEPTH 
    from DBC.All_RI_Parents where childdb='finance' and childtable='fin_loan'
    UNION ALL
    SELECT par.indexid,par.indexname,par.parentdb,par.parenttable,par.parentkeycolumn,
    par.childdb,par.childtable,par.childkeycolumn ,
    CTE.DEPTH + 1
    FROM CTE INNER JOIN DBC.All_RI_Parents par
    ON 
    CTE.parenttable = par.childtable
    and CTE.parentdb = par.childdb
    )
    SELECT * FROM CTE 
    

    【讨论】:

    • 您应该切换到All_RI_ParentsV(切勿使用旧版非 V 视图)。如果您只对表级别的关系感兴趣,则可以改用RI_Distinct_ParentsV。注意:如果存在交叉关系(例如 A-B-A 或 A-B-C-A),您将获得无限递归(实际上在您的情况下,当您达到 128 的 DEPTH 时会出现 numeric overflow)。顺便说一句,感谢您使用我的演示数据 :-)
    • 感谢@dnoeth,我们可以做些什么来避免无休止的递归?
    • 你需要添加一个path变量,见stackoverflow.com/a/25895902/2527905
    猜你喜欢
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多