Sql 两列中都不存在根的公共表表达式
这是普通CTE的一种变体,在这里可以找到节点的所有父节点。唯一的区别是: 最大后代没有空子代。相反,它根本不存在于子列中。 以下是我的尝试:Sql 两列中都不存在根的公共表表达式,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,这是普通CTE的一种变体,在这里可以找到节点的所有父节点。唯一的区别是: 最大后代没有空子代。相反,它根本不存在于子列中。 以下是我的尝试: 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) ins
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的父对象 如果5不是任何人的父级,那么您的筛选器父级=5将永远不会给出任何输出。5是一个子项,您希望找到它上面的所有父项:
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
这不是一个可行的层次结构。2和6两次被列为儿童。我甚至切换了字段名,认为可能是复制/粘贴错误。你的cte将建立一个层次结构,你可能不喜欢结果6有最大的人口我从来没有说过它是一棵树。没有什么规定一个孩子不能有多个父母或者一个父母不能有多个孩子。如果这是一个免费的/特别的层次结构,那就好了。我同意一个孩子可以有多个父母,也就是说,一份报告可以属于风险分析和季度结果,但为什么要问这个问题?很明显,5不是父母。谢谢我真是太傻了。将父对象更改为子对象,这样做有效。