2016-12-01 2 views
2

동일한 테이블 내에서 부모 관계로부터 값을 얻을 수 있는지 확인하려고합니다.SQL Server 계산 필드 - 부모 레코드의 데이터

아래 예에서 Parent_ID은 부모와의 관계입니다. RouteName은 이상적으로 직접 부모의 경로 이름 (또는 null의 경우 이름)을 선택하는 계산 된 필드 여야합니다.

이렇게하면 직접적인 부모 만 선택하여 완전한 경로를 만들 수 있으며 모든 레코드에서 반복 또는 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

하는 기능을 사용할 수 있습니까? 미리 정의되지 않은 경우 재귀가 유일한 합리적인 솔루션입니다. – FDavidov

+0

한계가 3 점입니다. 위와 거의 같습니다. – ExternalUse

+0

계산 된 필드에서 직접 부모의 이름을 얻을 수 있다면 현재 이름을 연결하여 문제를 해결할 수 있습니다. Pseudo : Parent_ID가 null이 아닌 경우 Select Parent.Name + '| '+ this.name – ExternalUse

답변

1

당신은 얼마나 많은 수준 _parenthood_의 당신이 기대하는 계산 열

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 
+0

제임스, 고맙습니다. 해당 열을 유지하면 성능 오버 헤드가 너무 중요하지 않을 수도 있습니다. 나는 FDavidov가 제안한 방아쇠 해결책을 여전히 숙고하고 있지만 다시 시도하고보고 할 것입니다. 나는 그것이 괜찮은지 시험 후에 대답을 받아 들일 것이다. – ExternalUse