Common Table Expression Where Roots are not present in both columns

Common Table Expression Where Roots are not present in both columns

这是正常 CTE 的变体,您可以在其中找到一个节点的所有 parent。唯一的区别是:

这是我的尝试:

insert into t (parent, child) values (1, 2)
insert into t (parent, child) values (1, 3)
insert into t (parent, child) values (4, 2)
insert into t (parent, child) values (2, 5)
insert into t (parent, child) values (2, 6)
insert into t (parent, child) values (9, 6)
insert into t (parent, child) values (6, 7)
insert into t (parent, child) values (6, 8)

with cte as
( 
    select child, parent, 0 as level 
    from t
    where parent = 5
    union all
    select q.child, q.parent, level+1 
    from t q
    inner join cte as c on c.parent= q.child
)

select distinct parent from cte 
where parent <> 5

在这种情况下,当我尝试获取 5 的所有 parent 时,没有找到任何东西,因为 5 对任何人都不是 parent。如果我尝试查找 2 的所有 parent,它会成功,因为 2 是 parent 到 56

如果 5 不是任何人的父级,那么您的过滤器 parent=5 将永远不会给出任何输出。 5 是一个 child 并且您想找到它上面的所有父级:

declare @t table (parent int, child int)

insert into @t (parent, child)
values (1, 2),
 (1, 3),
 (4, 2),
 (2, 5),
 (2, 6),
 (9, 6),
 (6, 7),
 (6, 8)

;with cte as
( 
    select child, parent, 0 as level 
    from @t
    where child = 5 ---<<<
    union all
    select q.child, q.parent, level+1 
    from @t q
    inner join cte as c on c.parent= q.child
)

select distinct parent from cte 
where parent <> 5