4

对于我无法解决的这个查询,我需要您的帮助。事情是这样的,假设我有一张这样的桌子:

Father | Son
1      |   2
1      |   3
1      |   4
3      |   5
3      |   6
2      |   7
4      |   8
5      |   9
6      |   10

所以你可以看到表格代表父子关系,我需要找到一个父亲的所有儿子(以及儿子的儿子),例如,如果我要寻找 1 号的儿子,我们会得到一个像这样的表格这

Father | son
1      |   2
1      |   3
1      |   4
1      |   5
1      |   6
1      |   7
1      |   8
1      |   9
1      |   10

如果我正在寻找 3 号的儿子,我们将得到:

Father | son
3      |   5
3      |   6
3      |   9
3      |   10

好吧,我想你明白我的意思了。下一个问题是我必须为表中的每个父亲都这样做。所以最后,表格如下:

Father | son
1      |   2
1      |   3
1      |   4
1      |   5
1      |   6
1      |   7
1      |   8
1      |   9
1      |   10
3      |   5
3      |   6
3      |   9
3      |   10
2      |   7
4      |   8
5      |   9
6      |   10

和翻过一棵树非常相似。我一直试图弄清楚这个查询一段时间但没有成功。我做了这样的代码

WITH  son
        AS (
              -- in 
            SELECT  FK_CC_B
            FROM    PG_Rols_CC  
            WHERE   FK_CC_A = @idCC
            UNION ALL
              --recur
            SELECT  t.FK_CC_B
            FROM     PG_Rols_CC AS t
                    JOIN hijos AS a
                      ON t.FK_CC_A = a.FK_CC_B
           )
insert into @TableSons (idSon) SELECT * FROM son

但它不能同时适用于每个父亲,结果表有点不同,它只有儿子 ID。例子

son
3
4
5
6
7

希望您能够帮助我。

4

2 回答 2

4

如果要获取所有父亲的后代,则需要去掉WHERE公用表表达式 (CTE) 第一部分中的子句。

如果要输出两列(Father 和 Descendent),则需要将这些列添加到 CTE 的两个部分。

像这样:

WITH Son
AS
(
    SELECT
        FK_CC_A AS Father,
        FK_CC_B AS Son
    FROM
        PG_Rols_CC
    UNION ALL
    SELECT
        f.Father,
        s.FK_CC_B AS Son
    FROM
        Son f
        INNER JOIN PG_Rols_CC s ON f.Son = s.FK_CC_A
)

SELECT * FROM Son
于 2012-11-27T22:16:57.593 回答
3

您需要从“递归”成员中引用“锚”部分......

做这样的事情:

WITH  son
        AS (
              -- in 
            SELECT  @Father, Son
            FROM    PG_Rols_CC  
            WHERE   FK_CC_A = @Father
            UNION ALL
              --recur
            SELECT  @Father, Son
            FROM     PG_Rols_CC AS t
                    JOIN son AS s
                      ON s.FK_CC_A = t.FK_CC_B
           )
SELECT * FROM son
于 2012-11-27T22:01:04.083 回答