SQL Server CTE层次结构?
我有一个表,其中包含层次结构 让我们从Id=5开始;这就是那个孩子。(a给定的启动参数-来自用户) 算法:SQL Server CTE层次结构?,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有一个表,其中包含层次结构 让我们从Id=5开始;这就是那个孩子。(a给定的启动参数-来自用户) 算法: 给我您遇到的id=5 如果您尚未找到id=5的值,请转到它的父级,并将其id 如果此父级也没有值-转到其父级。。。etc(直到父级没有父级-parentId=0) p、 这里的结果应该是7 如果7值为空,那么:9 如果9也为空,则结束:1 我正试图用CTE做这件事,但没有成功 p、 s.I想要一个带有CTE的解决方案。( 我尝试过的(甚至不要看它-它不起作用): 您需要加入您的cte
- 给我您遇到的
id=5
- 如果您尚未找到
id=5的值,请转到它的父级,并将其
id
- 如果此父级也没有值-转到其父级。。。etc(直到父级没有父级-
)parentId=0
您需要加入您的cte:
with cte as (
select
id,
value,
parentid
from
[tmp]
where
id=5
union all
select
tmp.id,
coalesce(cte.value, tmp.value) as value,
tmp.parentid
from
[tmp]
inner join cte on
tmp.id = cte.parentId
)
select
max(value) as value
from
cte
如果要引用表,需要确保已在
from
子句中的某个位置将其加入。在本例中,您没有这样做,这就是它抛出错误的原因。您的查询返回所有行。它假设只返回7。添加了coalesce
语句。现在,如果你想从某个任意点开始并找到值,那么你只需选择该点的顶部1并获取该值,因为它会一直冒泡cte.value
。谢谢你的努力,但是:如果我将id=5的值设为NULL,那么它会返回NULL,9,9我该如何处理3个项目?如何获取所需的值?将其更改为max(value)
。这样,它只获取第一个非空值。
with cte as (
select
id,
value,
parentid
from
[tmp]
where
id=5
union all
select
tmp.id,
coalesce(cte.value, tmp.value) as value,
tmp.parentid
from
[tmp]
inner join cte on
tmp.id = cte.parentId
)
select
max(value) as value
from
cte