2012-01-05 2 views
2

У меня есть таблица, в которой есть иерархия.Иерархия SQL Server CTE?

Позволяет начать с Id = 5; это ребенок. (Параметр а дало старта - от пользователя)

Алгоритм:

  • дает мне значение first с которым вы столкнулись на id = 5
  • , если вы не нашли значение для id = 5, перейдите на его родитель и дайте мне его id
  • если этот родитель также не имеет значения - перейдите к его родительскому объекту ... и т. д. (пока родитель не имеет родителя - parentId = 0)

p.s. результат здесь должен быть 7.

если 7 значение было пусто, так: 9

конец, если 9 был также пуст, так: 1

Я пытаюсь сделать это с КТР, но без успеха ..

ps I хочу решение с 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

Вам нужно зарегистрироваться в вашем КТР:

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. –

+0

Добавлен оператор 'coalesce'. Теперь, если вы хотите начать с какой-либо произвольной точки и найти значение, вы можете просто выбрать верхнюю часть 1 и захватить значение, так как оно будет пузырьком 'cte.value' до конца. – Eric

+0

спасибо за ваши усилия, но: Если я поставлю valud id = 5 NULL, так он вернет мне Null, 9,9. Что я могу сделать с 3-мя элементами? как я могу взять необходимое значение? –

Смежные вопросы