2016-12-01 18 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

関連する問題