Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server CTE层次结构?_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

SQL Server CTE层次结构?

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开始;这就是那个孩子。(a给定的启动参数-来自用户)

算法:

  • 给我您遇到的
    id=5
  • 如果您尚未找到
    id=5的值,请转到它的父级,并将其
    id
  • 如果此父级也没有值-转到其父级。。。etc(直到父级没有父级-
    parentId=0
p、 这里的结果应该是7

如果7值为空,那么:9

如果9也为空,则结束:1

我正试图用CTE做这件事,但没有成功

p、 s.I想要一个带有CTE的解决方案。(

我尝试过的(甚至不要看它-它不起作用):


您需要加入您的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