Common Table Expression Where Roots are not present in both columns
Common Table Expression Where Roots are not present in both columns
这是正常 CTE 的变体,您可以在其中找到一个节点的所有 parent。唯一的区别是:
- 最伟大的传人没有
null
child。相反,它根本不存在于 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
的所有 parent 时,没有找到任何东西,因为 5
对任何人都不是 parent。如果我尝试查找 2
的所有 parent,它会成功,因为 2
是 parent 到 5
和 6
。
如果 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
这是正常 CTE 的变体,您可以在其中找到一个节点的所有 parent。唯一的区别是:
- 最伟大的传人没有
null
child。相反,它根本不存在于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
的所有 parent 时,没有找到任何东西,因为 5
对任何人都不是 parent。如果我尝试查找 2
的所有 parent,它会成功,因为 2
是 parent 到 5
和 6
。
如果 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