Teradata 递归 SQL 查找给定 Child table 的 Parent 的 Parent
Teradata Recursive SQL to find Parents of Parent of given Child table
我已经安装了 Teradata Express 并在其中加载了名为 'Finance' 的公开可用的 teradata 数据库。
它有一些 parent-child 使用 PK-FK 的关系。
我的要求是找出给定child的所有parents,授予parents。
我已经使用了 DBC.All_RI_Parents
元数据 table 并编写了一个递归 SQL 来找出相同的但它没有给出 parent 的 parent 和伟大的 parents of given child.
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
如果我在这里做错了,请告诉我。
我通过深入研究数据发现不应添加 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
我已经安装了 Teradata Express 并在其中加载了名为 'Finance' 的公开可用的 teradata 数据库。
它有一些 parent-child 使用 PK-FK 的关系。
我的要求是找出给定child的所有parents,授予parents。
我已经使用了 DBC.All_RI_Parents
元数据 table 并编写了一个递归 SQL 来找出相同的但它没有给出 parent 的 parent 和伟大的 parents of given child.
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
如果我在这里做错了,请告诉我。
我通过深入研究数据发现不应添加 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