Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Получение родительского элемента (рекурсия)  [new]
hameleon
Member

Откуда:
Сообщений: 10
Добрый день!
Подскажите, пожалуйста, как получить значение родительского элекмента верхнего уровня?
id AccountId ParentId
1 123 NULL
2 124 123
3 125 123
4 126 124
5 127 125
6 128 123

Т.е. для AccountId = 124 нужно вывести ParentId = 123, для 125 - 123, для 126 - 123, 127 - 123 и т.д.
Буду очень благодарен за помощь.
26 фев 13, 10:44    [13981096]     Ответить | Цитировать Сообщить модератору
 Re: Получение родительского элемента (рекурсия)  [new]
Добрый Э - Эх
Guest
про рекурсивный СТЕ читал? Никаких мыслей не возникло?
26 фев 13, 10:47    [13981106]     Ответить | Цитировать Сообщить модератору
 Re: Получение родительского элемента (рекурсия)  [new]
Гость333
Member

Откуда:
Сообщений: 3683
declare @t table (id int, AccountId int, ParentId int);
insert @t values (1, 123, NULL);
insert @t values (2, 124, 123);
insert @t values (3, 125, 123);
insert @t values (4, 126, 124);
insert @t values (5, 127, 125);
insert @t values (6, 128, 123);

declare @id int = 127;
with cte as
(  select t.AccountId, t.ParentId, 1 as level
   from @t t
   where t.AccountId = @id
   
   union all
   
   select t.AccountId, t.ParentId, c.level + 1 as level
   from cte c
        inner join @t t on t.AccountId = c.ParentId
)
select top(1) c.AccountId
from cte c
order by c.level desc;
26 фев 13, 10:51    [13981123]     Ответить | Цитировать Сообщить модератору
 Re: Получение родительского элемента (рекурсия)  [new]
hameleon
Member

Откуда:
Сообщений: 10
Я пробовал получить требуемую выборку следующим способом:
WITH MyCTE
AS (
SELECT ch1.[id], ch1.[AccountId], ch1.[ParentId]
FROM [TestBase].[SR].[TestChild] AS ch1
WHERE ch1.[ParentId] IS NULL

UNION ALL

SELECT ch2.[id], ch2.[AccountId], ch2.[ParentId]
FROM [TestBase].[SR].[TestChild] AS ch2
JOIN MyCTE AS cte
ON ch2.[ParentId] = cte.[AccountId]
WHERE ch2.[ParentId] IS NOT NULL
)
SELECT *
FROM MyCTE

Результат слудеющий:
id AccountId ParentId
1 123 NULL
2 124 123
3 125 123
6 128 123
5 127 125
4 126 124
26 фев 13, 10:51    [13981124]     Ответить | Цитировать Сообщить модератору
 Re: Получение родительского элемента (рекурсия)  [new]
hameleon
Member

Откуда:
Сообщений: 10
Гость333
declare @t table (id int, AccountId int, ParentId int);
insert @t values (1, 123, NULL);
insert @t values (2, 124, 123);
insert @t values (3, 125, 123);
insert @t values (4, 126, 124);
insert @t values (5, 127, 125);
insert @t values (6, 128, 123);

declare @id int = 127;
with cte as
(  select t.AccountId, t.ParentId, 1 as level
   from @t t
   where t.AccountId = @id
   
   union all
   
   select t.AccountId, t.ParentId, c.level + 1 as level
   from cte c
        inner join @t t on t.AccountId = c.ParentId
)
select top(1) c.AccountId
from cte c
order by c.level desc;


Гость, большое спасибо! :)
26 фев 13, 10:54    [13981136]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить