У меня есть таблица, в которой есть иерархия.Иерархия SQL Server CTE?
Позволяет начать с Id = 5
; это ребенок. (Параметр а дало старта - от пользователя)
Алгоритм:
- дает мне значение
first
с которым вы столкнулись наid = 5
- , если вы не нашли значение для
id = 5
, перейдите на его родитель и дайте мне егоid
- если этот родитель также не имеет значения - перейдите к его родительскому объекту ... и т. д. (пока родитель не имеет родителя -
parentId = 0
)
p.s. результат здесь должен быть 7.
если 7 значение было пусто, так: 9
конец, если 9 был также пуст, так: 1
Я пытаюсь сделать это с КТР, но без успеха ..
ps I хочу решение с CTE. :)
То, что я пытался (даже не смотреть на него - это не работает):
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
Ваш запрос возвращает все строки. он должен возвращать только 7. –
Добавлен оператор 'coalesce'. Теперь, если вы хотите начать с какой-либо произвольной точки и найти значение, вы можете просто выбрать верхнюю часть 1 и захватить значение, так как оно будет пузырьком 'cte.value' до конца. – Eric
спасибо за ваши усилия, но: Если я поставлю valud id = 5 NULL, так он вернет мне Null, 9,9. Что я могу сделать с 3-мя элементами? как я могу взять необходимое значение? –