如何使用SQL查找祖父母?
我有一个有两列的表如何使用SQL查找祖父母?,sql,netezza,Sql,Netezza,我有一个有两列的表 ---------------------- | NAME | FATHER_NAME | ---------------------- 我这里有样本数据,如图所示 正如所期望的那样,输出将是 所以我试着用CONNECT_BY或递归CTE来解决这个问题 WITH REL_CTE AS ( SELECT NAME,FATHER_NAME, 1 AS L FROM RELATION WHERE FATHER_NAME IS NULL
----------------------
| NAME | FATHER_NAME |
----------------------
我这里有样本数据,如图所示
正如所期望的那样,输出将是
所以我试着用CONNECT_BY或递归CTE来解决这个问题
WITH REL_CTE AS
(
SELECT NAME,FATHER_NAME, 1 AS L
FROM RELATION
WHERE FATHER_NAME IS NULL
UNION ALL
SELECT R.NAME,R.FATHER_NAME,CTE.L+1
FROM RELATION R JOIN REL_CTE CTE
ON R.FATHER_NAME = CTE.NAME
)
SELECT * FROM REL_CTE
但未能达到预期的效果。因此需要寻找解决方案。一种可能的方法是使用递归CTE,如下所示。然而,如果你总是想要确切的祖父母,即我->父亲->祖父,你可以做一个自我加入,这将远比CTE更有效。注意,有了CTE,你可以得到曾祖父母等 自连接 递归CTE
是的,你可以写一个查询,你能帮我吗?看看你能帮我吗?不@adesh,我们的信息非常缺乏。这里需要样本数据、预期结果和您的尝试,您有足够的声誉知道如何发布一个好问题和一个坏问题是什么样子。花点时间努力并提供我们需要的一切帮助。@adesh,如果您对建议的递归CTE有问题,请编辑您的问题,将CREATE TABLE DDL和sample data INSERT语句以及您尝试过的查询包括在内。
WITH REL_CTE AS
(
SELECT NAME,FATHER_NAME, 1 AS L
FROM RELATION
WHERE FATHER_NAME IS NULL
UNION ALL
SELECT R.NAME,R.FATHER_NAME,CTE.L+1
FROM RELATION R JOIN REL_CTE CTE
ON R.FATHER_NAME = CTE.NAME
)
SELECT * FROM REL_CTE
select distinct
L2.FATHER_NAME as GRANDFATHER_NAME
from
dbo.RELATION as L1
inner join
dbo.RELATION as L2
on
L1.FATHER_NAME = L2.[NAME]
where
L2.FATHER_NAME is not null
WITH REL_CTE AS
(
-- the initial result will be every record from the relation
-- table with level 1
select NAME,FATHER_NAME, 1 as L
from RELATION
-- now start recursively walking up the tree
union all
select
cte.NAME
, rel.FATHER_NAME -- this will be the father at the coresponding level
-- so when L = 1 Father, L = 2 Grandfather, L = 3 Great Grandfather
, cte.L+1 as L
from
REL_CTE as cte
inner join
dbo.RELATION as rel
on
cte.FATHER_NAME = rel.NAME
)
-- if you specifically want grandparents you would only
-- want things at level 2
select distinct REL_CTE.FATHER_NAME from REL_CTE
where L = 2 and REL_CTE.FATHER_NAME is not null