SQL Server CTE层次结构?

时间:2012-01-05 20:42:45

标签: sql sql-server sql-server-2005

我有一张桌子,里面有层次结构。

让我们从Id = 5开始;这是孩子。 (给出启动参数 - 来自用户)

算法:

  • 告诉我first
  • 遇到的id = 5
  • 如果您没有找到id = 5的值,请转到其父级并将其id
  • 给我
  • 如果此父级也没有值 - 转到其父级...等等(直到父级没有父级 - parentId = 0

P.S。这里的结果应该是7。

如果7值为空,那么:9

如果9也是空的那么结束:1

我正在尝试用CTE做这个但没有成功..

P.S。我想要 CTE的解决方案。 :)

enter image description here

我尝试了什么(甚至不看它 - 它不起作用):

WITH cte AS (
SELECT  
       id,VALUE,parentid

  FROM [test].[dbo].[tmp]   WHERE id=5
  UNION ALL

  SELECT  
      id,VALUE,parentid
  FROM  [tmp]   WHERE parentId=cte.parentId ) //ERROR : The multi-part identifier "cte.parentId" could not be bound.
  SELECT * FROM cte

1 个答案:

答案 0 :(得分:2)

你需要加入你的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子句中的某个位置加入该表。在这种情况下,你没有,这就是它抛出错误的原因。