Вычисляемое поле SQL Server - данные из родительской записи

Я пытаюсь увидеть, смогу ли я получить значение из родительских отношений в той же таблице.

В приведенном ниже примере Parent_ID это отношение к родителю.RouteName в идеале должно быть вычисляемым полем, которое выбирает прямое имя родителя (или имя, если ноль)

Таким образом, я мог бы создать полный маршрут, только выбрав прямого родителя и сохранив итерации или CTE для всех записей. Это возможно?

+----+------------------+-------------------------------------+-----------+
| ID | Name             | RouteName                           | Parent_ID |
+----+------------------+-------------------------------------+-----------+
| 1  | Parent           | NULL                                |           |
+----+------------------+-------------------------------------+-----------+
| 2  | Child 1          | Parent - Child 1                    | 1         |
+----+------------------+-------------------------------------+-----------+
| 3  | Child of Child 1 | Parent - Child 1 - Child of Child 1 | 2         |
+----+------------------+-------------------------------------+-----------+

1 ответ

Вы можете использовать функцию для вычисляемого столбца

drop table MyTable
drop function dbo.fn_CalculateRouteName

create table MyTable
(
    ID int,
    Name varchar(100),  
    Parent_ID int
)
go

create function dbo.fn_CalculateRouteName(@ID int)
returns varchar(max)
begin
declare @rtn varchar(max);

with cte (ID, Name) as (
    select Parent_ID, convert(varchar(max), Name) From MyTable where ID = @ID
    union all
    select MyTable.Parent_ID, convert(varchar(max), MyTable.Name + ' - ' + cte.Name )
    from cte
    inner join MyTable on cte.Id = MyTable.ID 
)
select @rtn = max(Name)
from cte

return @rtn
end
go

alter table MyTable add RouteName AS dbo.fn_CalculateRouteName(ID);

insert into MyTable(ID, Name, Parent_ID) values(1, 'Parent', null);
insert into MyTable(ID, Name, Parent_ID) values(2, 'Child 1', 1);
insert into MyTable(ID, Name, Parent_ID) values(3, 'Child of Child 1', 2);

select * from MyTable
Другие вопросы по тегам