sql-server - 在数据库表中递归搜索,包括每行的一个到 N 个父项

标签 sql-server tsql

我有一张 table ,看起来像那样

 id   parent_id
 1    null
 2    1
 3    2
 4    1
 5    3  

对于表中的每一行,我想检索有关其父代的信息(从第一代到第 N 代)。这意味着,如果 id = 3 的行有 parent_id = 2 并且 id = 2parent_id = 1,那么 3 也属于 21

我想要得到的结果:

id    multi_level_parent_id
 1    null
 2    1
 3    2
 3    1
 4    1
 5    3
 5    2
 5    1

我假设,我必须使用递归 select。我写了SQL代码,但它只返回第一代的信息

WITH Rec AS
(
    SELECT *
    FROM MyTable t
    UNION ALL
    SELECT *
    FROM MyTable t
    INNER JOIN Rec r ON t.id = r.parent_id
)

SELECT *
FROM Rec

有人知道如何检索我需要的信息吗?

最佳答案

这就是你想要的:

WITH Rec
     AS (
     SELECT id,
            id AS parent_id,
            0 AS steps
     FROM MyTable  t
     UNION ALL
     SELECT r.id,
            t.parent_id,
            r.steps + 1 AS steps
     FROM MyTable  t
          INNER JOIN Rec r ON t.id = r.parent_id)
     SELECT id,
            parent_id
     FROM MyTable 
     WHERE parent_id IS NULL
     UNION ALL
     SELECT id,
            parent_id
     FROM Rec
     WHERE parent_id <> id
     ORDER BY id;

结果:

enter image description here

关于sql-server - 在数据库表中递归搜索,包括每行的一个到 N 个父项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44684921/

相关文章:

sql - T-SQL Len 函数未按预期工作

c# - 为 SQL WHERE 子句构建安全搜索条件

sql-server - SQL Server 触发器循环

mysql - 使用 ssis 结果导入到 sql 以将数据移动到下一列

sql - 为什么连接到 OLEDB 会出现连接错误

sql - Azure - 从我的本地计算机连接到 SQL Server

sql-server - 如何查找哪些存储过程正在使用哪些索引?

sql - 如何将变量设置为等于 0(如果为 null)或将其递增(如果不为 null)?

sql-server - 为什么我的数据透视查询无法正确分组?

sql-server - 我可以同时使用动态 LIKE 和 IN 吗?