2017-05-11 4 views
-1

dbo.Contractsという名前の契約データテーブルがあるとします。契約期間が終了すると、テーブルに新しい行が作成されます。新しい契約と古い契約の契約番号を追跡する必要があります。たとえば、契約番号123456は今日失効します。このアプリケーションは、今日更新契約を結んでいます(契約番号888888)。契約番号888888に属する行のフィールドdbo.Contracts.PreviousContractIDは123456に更新されます。エンティティリネージの保存とクエリ

しかし、最終的には契約の「連鎖」が存在します。 999999としてリニューアル契約888888、などとしてリニューアル123456など

---------------------------------------------------------------- 
Table dbo.Contracts 
---------------------------------------------------------------- 
ContractID | Lots of other fields | PreviousContractID 
---------------------------------------------------------------- 
123456  |      | NULL 
---------------------------------------------------------------- 
888888  |      | 123456 
---------------------------------------------------------------- 
999999  |      | 888888 

は、どのように私は、「チェーン内のすべての契約を照会し、与えられた契約番号999999」を言うためにクエリを記述します私はどこから始めるべきか分からない。私はフィールドdbo.Contracts.PreviousContractIDを追加することさえも正しいデザインさえしていません。

@ContractID = 999999 
Result set: 
---------- 
ContractID 
---------- 
999999 
---------- 
888888 
---------- 
123456 
---------- 

私は右ではなく、バンプ完全なコードソリューションを探していないよ:クエリは、「契約番号999999の場合は、 『チェーン』内のすべての契約を得る」と言うだろう希望

デザインの方向。このようなことがあれば、これは「再帰的自己結合」のように感じられ、私はそれを失ってしまいます。

+0

(https://technet.microsoft.com/en-us/ライブラリ/ ms186243(v = sql.105).aspx)。 –

+1

これは重複していないのですか? –

+0

...正しいデザインでもあります。 どちらも私は "正しい"デザインはあなたの目標とあなたがモデル化しようとしているものによって決まります。おそらく、あなたは "拡張"の間にある種の親子関係を形成する必要があります - 少なくとも1つの他のテーブルと視点の変更を意味します。 テーブルによって異なるアプローチを試し、データ/目標に対してそれらを検証する必要があることがあります。 – SMor

答えて

1

シンプルrecrusiveのCTEは、トリックを行う必要があり

Declare @YourTable Table ([ContractID] varchar(50),[PreviousContractID] varchar(50)) 
Insert Into @YourTable Values 
(123456,NULL) 
,(888888,123456) 
,(999999,888888) 

Declare @ContractID int = 999999  

;with cteHB as (
     Select [ContractID] 
      ,[PreviousContractID] 
      ,Lvl=1 
     From @YourTable 
     Where [ContractID][email protected] 
     Union All 
     Select R.[ContractID] 
      ,R.[PreviousContractID] 
      ,P.Lvl+1 
     From @YourTable R 
     Join cteHB P on P.[PreviousContractID] = R.[ContractID]) 
Select Lvl 
     ,A.[ContractID] 
     ,A.[PreviousContractID] 
From cteHB A 
Order By 1 

戻り

Lvl ContractID PreviousContractID 
1 999999  888888 
2 888888  123456 
3 123456  NULL 
あなたは[共通テーブル式]になっているはずです
+0

これはそれを行う必要があります。ありがとう! – HardCode

+0

@HardCodeそれは助けてくれた。 –

関連する問題