sql - 开发递归/层次结构查询

标签 sql sql-server

我需要您帮助解决这个我无法解决的问题。 事情是这样的,假设我有一个这样的表:

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

希望你能帮助我。

最佳答案

如果您想获取所有父亲的后代,则需要删除公共(public)表表达式 (CTE) 第一部分中的 WHERE 子句。

如果要输出两列(父亲和后代),则需要将这些列添加到 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

关于sql - 开发递归/层次结构查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13593763/

相关文章:

sql - 使用 R 一次将多条记录插入 Redshift

mysql - 表名指定两次,既作为更新目标又作为单独的数据源

c# - 提高大型数据集中的搜索性能

sql - 将数据复制到同一个表中或从同一个表中复制数据,并将复制的数据中某一列的值更改为指定值

sql-server - 在 SQL Server 中将单行的列值转换为带有列标题的 2 列

mysql - 500 个数据库或 1 个包含 500 个表的数据库或仅包含所有记录的 1 个表?

sql - Oracle SQL - 用以前的已知值替换空值

MySQL - 按连续 block 分组

mysql - 记录用户更新

sql-server - 将 nvarchar 列排序为整数