公用表表达式两列中不存在根

时间:2016-06-24 19:31:24

标签: sql sql-server common-table-expression

这是正常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的所有父母,则会成功,因为256的父级。

1 个答案:

答案 0 :(得分:2)

如果5不是任何人的父级,那么您的过滤器parent=5将永远不会提供任何输出。 5child,您希望在其上方找到所有父级:

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

enter image description here