2012-01-05 182 views
2

我有一个表中有层次结构。SQL Server CTE层次结构?

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

算法:

  • 给我,你已经遇到id = 5
  • ,如果你还没有找到价值id = 5first值,去其父母和给我他的id
  • 如果这个父母也没有价值 - 去其父母...等(直到父母没有父母 - parentId = 0

p.s.这里的结果应该是7

如果7值为空,因此:9

结束时,如果9也是空的,所以:1

我试图用CTE,但没有成功做到这一点..

ps我想想要与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 

回答

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子句中的某个地方。在这种情况下,你没有,这就是它抛出错误的原因。

+0

您的查询返回所有行。它假设只返回7. – 2012-01-05 21:14:13

+0

添加'coalesce'语句。现在,如果您想从某个任意点开始并找到该值,那么您可以选择该值的前1并获取该值,因为它会将cte.value一直吹到上面。 – Eric 2012-01-05 21:18:25

+0

感谢fot你的努力,但:如果我把id = 5 NULL的值,所以它返回我空,9,9我想做什么3项?我怎样才能获得所需的价值? – 2012-01-05 21:23:38