2017-03-12 9 views
0

I "私は私から1を選択したとき、最終的な結果は3になりたい。この例では、このSQLサーバーの無制限の結合/結合ですか?

Activity | ActivityId 
Skiing |  1 
Swimming |  2 
climbing |  3 

そして、このようなもののように2台(活性により置換活性)

ActivityId | ShouldBeReplacedWithActivityId 
    1  |   2 
    2  |   3 

を有しますアクティビティはアクティビティ "テーブルに置き換えられました。これは1で始まり、このアクティビティは2に置き換えられます。しかし、2つも3に置き換えられます。

アクティビティの数は無制限で、「アクティビティによってアクティビティが置き換えられました」 これを実行する方法はありますかストアドプロシージャ/関数を使用せずに?このクエリからビューを作成することができます(結果は他のデータとの結合で使用できます)

この例は、私が助けが必要なものを説明するために簡略化されています。解決策は、新しいテーブルの作成が含ま/またはそれはあなたが再帰CTEを探している既存のソリューション

答えて

1

と一緒に使用する必要があるため、データ構造を変更しないでください。

with cte as (
     select ShouldBeReplacedWithActivityId as activityId, 1 as lev 
     from table2 
     where activityId = 1 
     union all 
     select t.ShouldBeReplacedWithActivityId, cte.lev + 1 
     from cte join 
      table2 t 
      on cte.activityId = t.activityId 
    ) 
select top 1 cte.* 
from cte 
order by lev desc; 

あなたはあまりにも多くの活動がありましたら、最大再帰オプションを設定する必要があります。アクティビティのサイクルについても注意する必要があります。

+0

ありがとうございます。私はこれでテストします:) –

+0

どこが定義されているか/何ですか? –

+0

't'は元の質問に投稿したデータを含むテーブルになります。あなたのテーブルを参照せずにこのクエリがどのように機能すると思いますか? –