Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SQL查找祖父母?_Sql_Netezza - Fatal编程技术网

如何使用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