Вычисляемое поле 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