Я понимаю, что это старая тема, но я не понимаю эту проблему.
Класс - это просто абстракция понятия, которое связывает функциональность его методов вместе более дружелюбным человеком способом. Например, класс WaveGenerator может включать в себя методы Sine, Sawtooth и SquareWave. Все три метода явно связаны с генератором классов. Однако все трое также не имеют гражданства. Если они разработаны правильно, им не нужно сохранять информацию о состоянии вне метода. Это делает их объектами без гражданства, которые, если я правильно понимаю, делают их неизменяемыми функциями, которые являются основной концепцией в функциональной парадигме.
С концептуальной точки зрения я не вижу никакой разницы между
пусть Envelope Sine = ...
и
позволяет Envelope Generator.Sine = ...
, кроме того, что последний может обеспечить большее понимание цели функции.
Один из способов сделать это - использовать рекурсивный cte, который также будет сохранять корневой узел каждой рекурсии, а затем запрашивать этот cte на основе корня нужного узла.
Сначала создайте и заполните образец таблицы: ( Пожалуйста, сохраните нам этот шаг в ваших будущих вопросах)
DECLARE @T AS TABLE
(
NodeId int,
Parent int
);
INSERT INTO @T (NodeId, Parent) VALUES
(1 , 0),
(3 , 1),
(7 , 3),
(8 , 3),
(4 , 1),
(9 , 4),
(10, 4),
(2 , 0),
(5 , 2),
(11, 5),
(12, 5),
(6 , 2),
(13, 6);
Рекурсивный cte:
WITH CTE AS
(
SELECT NodeId, Parent, NodeId As Root
FROM @T
WHERE Parent = 0
UNION ALL
SELECT t.NodeId, t.Parent, Root
FROM @T As t
JOIN CTE
ON t.Parent = CTE.NodeId
)
Запрос:
SELECT NodeId, Parent
FROM CTE
WHERE Root = (SELECT Root FROM CTE WHERE NodeId = 4)
Результаты:
NodeId Parent
1 0
3 1
4 1
9 4
10 4
7 3
8 3