2016-12-01 88 views
2

我試圖查看是否可以從同一個表內的父關係獲取值。SQL Server計算字段 - 來自父記錄的數據

在下面的示例中,Parent_ID是與父級的關係。 RouteName理想情況下應該是一個計算字段,用於選擇直接父級的路由名(或名稱,如果爲null)。

這樣,我可以創建一個完整的路由,只需選擇直接的父節點,並將跨所有記錄保存迭代或CTE'ing。 這可能嗎?

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

如何_parenthood_的多層次,你期待?如果沒有預先定義,遞歸將是唯一合理的解決方案。 – FDavidov

+0

我有三個極限 - 幾乎完全如上。 – ExternalUse

+0

如果我可以在計算字段中獲得直接父母的姓名,我可以將當​​前姓名連接起來,那麼我的問題就可以解決。 Pseudo:如果Parent_ID不爲null,則選擇Parent.Name +'| '+ this.name – ExternalUse

回答

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

謝謝詹姆斯,我會試試這個。如果我堅持這個專欄,性能開銷可能不會太重要,我認爲?我仍在琢磨FDavidov建議的觸發解決方案,但會嘗試回報。如果沒有問題,我會在測試後接受答案。 – ExternalUse