这是正常CTE的变体,您可以在其中找到节点的所有父节点。唯一的区别是:
null
孩子。相反,它只是不在child
列中。 这是我的尝试:
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
时,找不到任何内容,因为5
不是任何人的父母。如果我尝试查找2
的所有父母,则会成功,因为2
是5
和6
的父级。
答案 0 :(得分:2)
如果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