2012-01-05 244 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